2

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

  1. 将 www 重定向到非 www
  2. 保留已请求的路径(例如domain.com/path/to/file.php
  3. 保留查询字符串,如果有的话(例如domain.com/path/to/file.php?key=val&key2=val2
  4. 保留已请求的协议(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.phphttp://domain.com/file.php,当它应该重定向到时https://domain.com/path/file.php。)

有任何想法吗?

4

1 回答 1

4

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

RewriteCond %{HTTPS}:s (on:(s)|off:s)

这将使用%{HTTPS}“on”或“off”的变量,并将其与s. 然后我们匹配on:(s)off:s。因此,如果 HTTPS 为“on”,则被(s)分组,我们可以使用 a 反向引用它%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]
于 2013-01-18T19:24:29.970 回答