我试图在 .htaccess 中实现以下目标:
- 将 www 重定向到非 www
- 保留已请求的路径(例如
domain.com/path/to/file.php
) - 保留查询字符串(如果有)(例如
domain.com/path/to/file.php?key=val&key2=val2
) - 保留已请求的协议(protocol)(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,并重定向到正确的协议(protocol)。现在,您将所有内容重定向到 http://
。您可以使用此条件和分组:
RewriteCond %{HTTPS}:s (on:(s)|off:s)
这使用 %{HTTPS}
变量(“on”或“off”),并将其与 s
配对。然后我们匹配 on:(s)
或 off:s
。因此,如果 HTTPS 为“on”,则 (s)
会被分组,我们可以使用 %2
反向引用它,否则,如果 HTTPS 为“off”,则不会有任何结果已分组,%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
中,这意味着当它通过这些规则发送时,它会被剥离。您需要将它们移至文档根目录。或者,如果您必须将规则放在 /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]
关于apache - .htaccess www 到非 www,同时保留路径、ssl 和查询字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14402065/