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]【讨论】:
恕我直言,与已接受的解决方案相比,应该首选此解决方案,因为从匹配中省略前导 / 比从重写中省略更干净。 次要,但是RewriteRule
pattern中的正斜杠不需要反斜杠转义。
@MrWhite 为什么不用转义呢?不是特殊字符吗?谢谢!
@StockBreak 正斜杠不是正则表达式中的“特殊字符”。正斜杠有时用于“分隔”正则表达式(在某些环境中),但在 Apache 配置文件中(使用 Apache 表达式时除外),空格是正则表达式(和参数)分隔符。跨度>
谢谢,我以为 Apache 内部使用了/
作为分隔符。【参考方案4】:
固定为:
RewriteEngine On
RewriteCond %HTTP_HOST ^mydomain\.com$ [NC]
RewriteRule ^(.*)$ http://www.mydomain.com$1 [R=301,L]
因为$1
默认包含索引路径/
【讨论】:
值得向其他读者澄清一下,这只适用于在 server 或 virtualhost 上下文中使用该指令的情况。当在 目录(即<Directory>
容器)或.htaccess
上下文中使用时,与RewriteRule
pattern 匹配的 URL 路径不包含斜杠前缀.【参考方案5】:
在你的模式中加入一个斜线应该可以解决这个问题:
RewriteRule ^/(.*)$ http://www.example.com/$1 [R=301,L]
【讨论】:
以上是关于mod_rewrite 和双斜杠问题的主要内容,如果未能解决你的问题,请参考以下文章
带有斜杠的 mod_rewrite 会破坏 CSS/IMG/SCRIPTS 路径