【问题标题】:Something wrong in my .htaccess/mod_rewrite rule?我的 .htaccess/mod_rewrite 规则有问题吗?
【发布时间】:2017-12-11 15:15:03
【问题描述】:

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

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

当检查它的 URL 时

http://example.com/something

这会将我重定向到

http://www./something

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

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

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

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

【问题讨论】:

  • 这有点令人困惑。您是否要添加重写,以便您网站上的所有页面在没有 www 的情况下加载。在地址栏中?
  • 问题是为什么 '%1' 是空的。问题处于否定模式,如下面的答案中所述@Michael-Berkowski。

标签: apache .htaccess mod-rewrite


【解决方案1】:

不要将HTTP_HOST 捕获为%1(.*)(这对您不起作用),只需将%{HTTP_HOST} 替换为RewriteRule

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

按照您的方式,您的 %1 似乎由于 ! 的否定而没有填充。

来自the RewriteRule documentation

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

【讨论】:

  • +1 没有看到你的最后一句话并回答相同。我想应该是粗体。
  • 就是这样!感谢您提供如此详细的信息!最好的问候。
【解决方案2】:

这种标准的做法似乎是:

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

这就是mediatemplewordpress 等推荐他们的用户设置他们的 .htaccess 文件的方式。

【讨论】:

  • 是的,没错,无需协商,它就可以工作 - 我知道,无论如何,谢谢。
猜你喜欢
  • 1970-01-01
  • 2012-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-31
相关资源
最近更新 更多