Перенаправление не с www на www не удаляет обратную косую черту

У меня есть небольшая проблема с перенаправлением 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]

1 ответ

Решение

Причина 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//

Другие вопросы по тегам