Apache .htaccess www到非www,同时保留路径、ssl和查询字符串

Apache .htaccess www到非www,同时保留路径、ssl和查询字符串,apache,.htaccess,Apache,.htaccess,我试图在.htaccess中实现以下目标: 将www重定向到非www 保留已请求的路径,例如domain.com/path/to/file.php 保留查询字符串(如果有),例如domain.com/path/to/file.php?key=val&key2=val2 保留已请求的http或https协议 我尝试了以下代码: RewriteEngine On RewriteCond %{HTTP_HOST} !^domain\.com$ [NC] RewriteRule ^(.*)$ http:

我试图在.htaccess中实现以下目标:

将www重定向到非www 保留已请求的路径,例如domain.com/path/to/file.php 保留查询字符串(如果有),例如domain.com/path/to/file.php?key=val&key2=val2 保留已请求的http或https协议 我尝试了以下代码:

RewriteEngine On
RewriteCond %{HTTP_HOST} !^domain\.com$ [NC]
RewriteRule ^(.*)$ http://domain.com/$1 [R=301,L]
但它不尊重http/https,也不保留已请求的路径,例如重定向https://www.domain.com/path/file.php 到http://domain.com/file.php,当它应该重定向到https://domain.com/path/file.php 相反


有什么想法吗?

您需要检查请求是http还是https,并重定向到正确的协议。现在,您正在将所有内容重定向到http://。您可以使用此条件和分组:

RewriteCond %{HTTPS}:s (on:(s)|off:s)
这将使用%{HTTPS}变量(on或off),并将其与s配对。然后我们匹配on:s或off:s。因此,如果启用HTTPS,则会对s进行分组,我们可以使用%2对其进行反向引用,否则,如果禁用HTTPS,则不会对任何内容进行分组,并且%2为空。然后,我们可以在重定向中使用它:

RewriteEngine On
RewriteCond %{HTTP_HOST} !^domain\.com$ [NC]
RewriteCond %{HTTPS}:s (on:(s)|off:s)
RewriteRule ^(.*)$ http%2://domain.com/$1 [R=301,L]
至于没有保留路径的第二件事,听起来您的规则好像在目录/路径中,这意味着当通过这些规则发送时,它会被剥离。您需要将它们移动到文档根目录。或者,如果必须将规则放在/path目录中,则可以改用%{REQUEST_URI}变量:

RewriteEngine On
RewriteCond %{HTTP_HOST} !^domain\.com$ [NC]
RewriteCond %{HTTPS}:s (on:(s)|off:s)
RewriteRule ^ http%2://domain.com%{REQUEST_URI} [R=301,L]

您需要检查请求是http还是https,并重定向到正确的协议。现在,您正在将所有内容重定向到http://。您可以使用此条件和分组:

RewriteCond %{HTTPS}:s (on:(s)|off:s)
这将使用%{HTTPS}变量(on或off),并将其与s配对。然后我们匹配on:s或off:s。因此,如果启用HTTPS,则会对s进行分组,我们可以使用%2对其进行反向引用,否则,如果禁用HTTPS,则不会对任何内容进行分组,并且%2为空。然后,我们可以在重定向中使用它:

RewriteEngine On
RewriteCond %{HTTP_HOST} !^domain\.com$ [NC]
RewriteCond %{HTTPS}:s (on:(s)|off:s)
RewriteRule ^(.*)$ http%2://domain.com/$1 [R=301,L]
至于没有保留路径的第二件事,听起来您的规则好像在目录/路径中,这意味着当通过这些规则发送时,它会被剥离。您需要将它们移动到文档根目录。或者,如果必须将规则放在/path目录中,则可以改用%{REQUEST_URI}变量:

RewriteEngine On
RewriteCond %{HTTP_HOST} !^domain\.com$ [NC]
RewriteCond %{HTTPS}:s (on:(s)|off:s)
RewriteRule ^ http%2://domain.com%{REQUEST_URI} [R=301,L]

谢谢,乔恩,这看起来很棒。您现在在/path中的规则是正确的-它是一个dev文件夹,我忘了提到它稍后将被移动到根目录。下周我将尝试一下您的代码,但我已经将其标记为解决方案,因为它看起来非常可靠。谢谢谢谢,乔恩,这看起来很棒。您现在在/path中的规则是正确的-它是一个dev文件夹,我忘了提到它稍后将被移动到根目录。下周我将尝试一下您的代码,但我已经将其标记为解决方案,因为它看起来非常可靠。谢谢