非 www 到 www 重定向不会删除尾随反斜杠

Dan*_*oss 2 apache mod-rewrite canonical-link

我在 Apache 重定向方面遇到了一些问题。虽然波纹管规则适用于网站上的任何页面,但 mydomain.com 将被重定向到 mydomain.com//,这会忽略尾部斜杠删除规则。

使用多个规则是否有效,或者我应该尝试将它们组合或以某种方式将它们链接在一起以避免单个 url 的多次重定向?

谢谢

#Turn on options for url rewriting
         Options +FollowSymlinks
         RewriteEngine on

 #lovercase all urls
         RewriteMap  lc int:tolower
         RewriteCond %{REQUEST_URI} [A-Z]
         RewriteCond %{REQUEST_URI} ^/fonts/.*
         RewriteCond %{REQUEST_URI} ^/css/.*
         RewriteCond %{REQUEST_URI} ^/js/.*
         RewriteRule (.*) ${lc:$1} [R=301,L]

 #redirect all requests made to http:// to http://www.
         RewriteCond %{HTTP_HOST} ^mydomain\.com$ [NC]
         RewriteRule ^(.*)$ http://www.mydomain.com/$1 [R=301,L]

 #removes trailing slash
         RewriteCond %{REQUEST_FILENAME} !-f
         RewriteCond %{REQUEST_FILENAME} !-d
         RewriteCond %{HTTP_HOST} !^\.localhost$ [NC]
         RewriteRule ^(.+)/$ http://%{HTTP_HOST}$1 [R=301,L]
Run Code Online (Sandbox Code Playgroud)

Jon*_*Lin 5

mydomain.com重定向到的原因www.mydomain.com//是因为您的重写规则目标中有一个额外的“/”:

RewriteRule ^(.*)$ http://www.mydomain.com/$1 [R=301,L]
                                          ^----here
Run Code Online (Sandbox Code Playgroud)

当你在你的服务器规则/虚拟主机配置,不删除前导斜杠,这样得到匹配,并作为一个反向引用,所以mydomain.com/其匹配^(.*)$和目标变得http://www.mydomain.com//。因此,您可以删除目标中的斜杠或在正则表达式中添加一个斜杠:

RewriteRule ^(.*)$ http://www.mydomain.com$1 [R=301,L]
or
RewriteRule ^/(.*)$ http://www.mydomain.com/$1 [R=301,L]
Run Code Online (Sandbox Code Playgroud)

您拥有的其他规则:

     RewriteCond %{REQUEST_FILENAME} !-f
     RewriteCond %{REQUEST_FILENAME} !-d
     RewriteCond %{HTTP_HOST} !^\.localhost$ [NC]
     RewriteRule ^(.+)/$ http://%{HTTP_HOST}$1 [R=301,L]
Run Code Online (Sandbox Code Playgroud)

没事。它们用于在它们之间存在某些东西时删除尾部斜杠,例如/something/,由于(.+). 它//无论如何都不会匹配,因为它本质上会变成 just /. 您只需要防止重定向到http://www.mydomain.com//