apache mod_rewrite和双斜杠问题

jw5wzhpr  于 2022-11-16  发布在  Apache
关注(0)|答案(5)|浏览(166)

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

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

但是,有一个双斜线问题:

  • 当我转到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

我的配置适合SEO吗?

ngynwnxp

ngynwnxp1#

固定有:

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

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

t9eec4r0

t9eec4r02#

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

wwtsj6pe3#

实际上,由于

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

再加上REQUEST_URI(您要匹配的)通常包含一个起始斜杠,您可以尝试RewriteRule ^(.*)$ http://example.com$1,然后发送一个中断的HTTP请求GET foo HTTP/1.0,看看Apache是否能正确处理它。

u4vypkhs

u4vypkhs4#

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

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

cnwbcb6i5#

这是因为根路径是/,并且您要追加RewriteRule中的任何内容(第一种情况工作正常,因为它 * 不 * 匹配条件,所以不执行重写)。
您可以尝试以下操作:

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

相关问题