2

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

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

谢谢

#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]
4

1 回答 1

5

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

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

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/,因为(.+). 无论如何它都不匹配//,因为它天生就会变成 just /。您只需要防止重定向到http://www.mydomain.com//

于 2012-02-15T11:00:24.730 回答