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]