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

bob*_*oap 2 apache .htaccess

我试图在 .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]
Run Code Online (Sandbox Code Playgroud)

但它不尊重 http/https,也不保留已请求的路径(例如,它重定向https://www.domain.com/path/file.phphttp://domain.com/file.php, 当它应该重定向到时https://domain.com/path/file.php。)

有任何想法吗?

Jon*_*Lin 5

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

RewriteCond %{HTTPS}:s (on:(s)|off:s)
Run Code Online (Sandbox Code Playgroud)

这使用了%{HTTPS}“on”或“off”变量,并将其与s. 然后我们匹配on:(s)off:s。因此,如果 HTTPS 为“打开”,则(s)进行分组,我们可以使用 a 反向引用它%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]
Run Code Online (Sandbox Code Playgroud)

至于关于不保留路径的第二件事,听起来你的规则在目录中/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]
Run Code Online (Sandbox Code Playgroud)