2012-02-15 6 views
2

У меня проблема с перенаправлением Apache. В то время как правила ниже действуют для любой страницы на сайте, mydomain.com перенаправляется на mydomain.com//, который игнорирует правило удаления сляба.Non www to www redirect не удаляет обратную косую черту

Также эффективно ли использовать несколько правил, таких как это, или я должен попытаться объединить их или связать их как-то вместе, чтобы избежать множественных перенаправлений для одного 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] 
+0

следующие правила в файле .htaccess или в конфигурации server/vhost? –

+0

находятся в главном файле конфигурации apache. –

ответ

4

Причина mydomain.com перенаправляется www.mydomain.com// потому, что у вас есть дополнительный «/» в вашей цели правила переписывания:

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

Если у вас есть правила на сервере/vhost config, ведущая косая черта не удаляется, так что получается совпадение и используется как обратная ссылка, поэтому 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//

+0

Спасибо, он отлично работает. К сожалению, я все еще новичок здесь, поэтому я не могу дать вам заслуженные голоса. T_T –