如何在不使用 .htaccess 进行硬编码的情况下将非 www 重定向到 www?

如何在不使用 .htaccess 进行硬编码的情况下将非 www 重定向到 www?
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

...导致完美的、非硬编码的 301 重定向,从“www 到非 www”,完全相反的情况会是什么样子?

编辑:

根据 Prix 的帖子,我已将.htaccess文件更改为以下内容:

Options +FollowSymLinks
<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteBase /
  RewriteCond %{HTTPS} !=on
  RewriteCond %{HTTP_HOST} !^www\.(.+)$ [NC]
  RewriteRule ^(.*)$ http://www.%1/$1 [R=301,L]
</IfModule>

正如前面提到的,http://www./很不幸,这会重定向到。谁能帮忙?

答案1

Prix​​ 几乎做到了。当您否定RewriteCond(使用!)时,它不会捕获,因此%1为空。两种可能的解决方案:

假的RewriteCond

RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTP_HOST} ^(.+)$ [NC]
RewriteRule ^/(.*)$ http://www\.%1/$1 [R=301,L]

%{HTTP_HOST}RewriteRule

RewriteCond %{HTTP_HOST} !^www\.(.+)$ [NC]
RewriteRule ^/(.*)$ http://www\.%{HTTP_HOST}/$1 [R=301,L]

答案2

总而言之,一个干净的、经过测试的代码版本:

对我来说,这可以将 www 重定向到非 www

重写引擎开启
RewriteCond %{HTTPS} !=on
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
重写规则 ^(.*)$ http://%1/$1 [R=301,L]

其中任何一个都可以(对我来说)将非 www 重定向到 www

RewriteCond %{HTTP_HOST} !^www\.(.+)$ [NC]
重写规则 ^(.*)$ http://www\.%{HTTP_HOST}/$1 [R=301,L]

或者

RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTP_HOST} ^(.+)$ [NC]
重写规则 ^(.*)$ http://www\.%1/$1 [R=301,L]

答案3

RewriteCond %{HTTP_HOST} !^www\.(.+)$ [NC]
RewriteCond %{HTTP_HOST} ^(.+)\.(.+)$ [NC]
RewriteRule ^(.*)$ http://www\.%2/$1 [R=301,L]

意思!是如果它不是以“www...”开头,那么将它发送www.%1(.+)

答案4

对于我来说,以下方法对于 Apache 2 一直有效:

RewriteCond %{HTTP_HOST} ^example\.com$ [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [L,R=301]

相关内容