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

时间:2012-02-15 07:53:57

标签: apache mod-rewrite canonical-link

我在Apache重定向方面遇到了一些问题。 虽然bellow规则适用于网站上的任何页面,但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]

1 个答案:

答案 0 :(得分:4)

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

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

如果您的服务器/ vhost配置中有规则,则不会删除前导斜杠以使其匹配并用作反向引用,因此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]

你的其他规则:

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

很好。它们用于在它们之间存在某些东西时去除拖尾斜线,例如: /something/,因为(.+)。它无论如何都不会与//匹配,因为它本身就变成了/。您只需要阻止重定向到http://www.mydomain.com//