我的.htaccess / mod_rewrite规则出了什么问题?

时间:2013-02-12 03:22:42

标签: apache .htaccess mod-rewrite

.htaccess的下一个简单规则,用于将非www的所有请求重定向到www:

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

并使用种类的网址检查

http://example.com/something

这会将我重定向到

http://www./something

似乎RewriteCond有效,但正则表达式没有任何结果,我认为必须是没有www的主机名。怎么了 - 谁知道?

重定向到具体主机的规则变体,如:

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

和其他类似的变种工作正常。

2 个答案:

答案 0 :(得分:2)

而不是使用HTTP_HOST%1捕获到(.*)(这对您不起作用),而只需替换%{HTTP_HOST}中的RewriteRule:< / p>

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

您拥有它的方式,由于%1否定,您的!未填充,看起来就像。

来自the RewriteRule documentation

  

使用NOT字符否定模式时,不能在该模式中包含分组通配符部分。这是因为,当模式不匹配时(即,否定匹配),组没有内容。因此,如果使用了否定模式,则不能在替换字符串中使用$ N!

答案 1 :(得分:0)

这种标准方式似乎是:

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

这就是mediatemplewordpress等建议用户设置.htaccess文件的方式。