Перенаправление не с 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//