Я использую следующий код для перенаправления всех запросов www на не-www адреса:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.example\.org$ [NC]
RewriteRule ^(.*)$ http://example.com/$1 [R=301,L]
Это прекрасно работает внутри файла .htaccess в корне моего сайта.
Например,
www.example.com -> example.com/
www.example.com/ -> example.com/
www.example.com/other_page -> example.com/other_page
Однако, если я перенесу этот же код в конфигурацию VirtualHost, переписанные URL-адреса содержат двойную косую черту.
www.example.com -> example.com//
www.example.com/ -> example.com//
www.example.com/other_page -> example.com//other_page
Я исправил это, удалив косую черту из правила перезаписи:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.example\.org$ [NC]
RewriteRule ^(.*)$ http://example.com$1 [R=301,L]
Но я не могу понять причину этого. Кто-нибудь знает почему?
источник
RewriteRule ^/?(.*)$ http://example.com/$1 [R=301,L]
сделал свое дело.Это происходит потому, что вы захватываете начальную косую черту
(.*)
и затем применяете другую косую черту перед ней в новом месте/$1
. Этого не было раньше, потому что mod_rewrite ведет себя немного по-другому при работе в контексте для каждого каталога, в отличие от контекста для каждого сервера.Вы можете избежать этого, опционально опередив косую черту. Кроме того, вы можете использовать RedirectMatch в пустом VirtualHost со своими избыточными доменами, что создает немного меньше обработки и может выглядеть чище.
источник
Я включаю этот пост для полноты.
Документация Apache объясняет, почему это происходит очень хорошо, и является причиной, по которой существует директива RewriteBase.
Простое включение директивы RewriteBase в ваш файл .htaccess позволит достичь желаемого результата.
Пример:
Из документации Apache 2.2 mod_rewrite:
Мое эмпирическое правило - почти всегда использовать 'RewriteBase' в файлах .htaccess, а не использовать его в конфигурации Apache.
источник
У меня не было времени для решения этой проблемы, поэтому просто переписать // в / :)
источник