mod_rewrite 和双斜杠问题

Posted

技术标签:

【中文标题】mod_rewrite 和双斜杠问题【英文标题】:mod_rewrite and double slash issue 【发布时间】:2011-05-15 07:55:05 【问题描述】:

我在Apache2 中应用了以下mod_rewrite 规则以从非www 重定向到www:

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

我有两个问题:

1) 存在双斜线问题:

当我去http://www.example.com时 正确地将 URL 重写为 http://www.example.com/ 当我去 http://www.example.com/somepage,没错 将 URL 重写为 http://www.example.com/somepage 如果我 去http://example.com,它 将 URL 重写为 http://www.example.com//(双斜线) 如果我去 http://example.com/somepage,它 正确地将其重写为 http://www.example.com/somepage

有什么解决办法吗?

2) 我的配置是否适合 SEO?

【问题讨论】:

【参考方案1】:

实际上,由于

,你总是会有双斜线
RewriteRule ^(.*)$ http://www.wxample.com/$1 [R=301,L]

结合 REQUEST_URI(您正在匹配的)通常包含一个起始斜杠这一事实。你可以试试RewriteRule ^(.*)$ http://example.com$1,然后发送一个破碎的HTTP请求GET foo HTTP/1.0,看看Apache是​​否处理得当。

【讨论】:

【参考方案2】:

那是因为根路径是/,并且您正在附加您在RewriteRule 中获得的任何内容(第一种情况可以正常工作,因为它符合条件,因此不会重写执行)。

你可以试试这样的:

RewriteEngine On
RewriteCond %HTTP_HOST ^mydomain\.com$ [NC]
# for the home page
RewriteRule ^/$ http://www.mydomain.com/ [R=301,L]
# for the rest of pages
RewriteRule ^(.*)$ http://www.mydomain.com/$1 [R=301,L]

【讨论】:

【参考方案3】: RewriteRule ^\/?(.*)$ http://www.mydomain.com/$1 [R=301,L]

【讨论】:

恕我直言,与已接受的解决方案相比,应该首选此解决方案,因为从匹配中省略前导 / 比从重写中省略更干净。 次要,但是RewriteRulepattern中的正斜杠不需要反斜杠转义。 @MrWhite 为什么不用转义呢?不是特殊字符吗?谢谢! @StockBreak 正斜杠不是正则表达式中的“特殊字符”。正斜杠有时用于“分隔”正则表达式(在某些环境中),但在 Apache 配置文件中(使用 Apache 表达式时除外),空格是正则表达式(和参数)分隔符。跨度> 谢谢,我以为 Apache 内部使用了/ 作为分隔符。【参考方案4】:

固定为:

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

因为$1默认包含索引路径/

【讨论】:

值得向其他读者澄清一下,这只适用于在 servervirtualhost 上下文中使用该指令的情况。当在 目录(即<Directory> 容器)或.htaccess 上下文中使用时,与RewriteRule pattern 匹配的 URL 路径不包含斜杠前缀.【参考方案5】:

在你的模式中加入一个斜线应该可以解决这个问题:

RewriteRule ^/(.*)$ http://www.example.com/$1 [R=301,L]

【讨论】:

以上是关于mod_rewrite 和双斜杠问题的主要内容,如果未能解决你的问题,请参考以下文章

mod_rewrite:删除尾部斜杠(只有一个!)

删除多个尾随斜杠 mod_rewrite

带有斜杠的 mod_rewrite 会破坏 CSS/IMG/SCRIPTS 路径

URI 和双斜杠

将站点上的所有页面(包括子文件夹)的 mod_rewrite 写入单个 php 页面

Postgresql regexp_replace() 反斜杠和双引号