Назад | Перейти на главную страницу

mod_rewrite перенаправляет на www.example.com// при попытке доступа к example.com

У меня есть VPS, на котором я пытаюсь настроить несколько веб-сайтов. Для одного из них, с текущим набором правил (ниже), доступ

hxxp://example.com 

отправляет меня в

hxxp://www.example.com// [note the two //]

Мой httpd.conf выглядит так:

NameVirtualHost *:80

[other VirtualHosts]

<VirtualHost *:80>
ServerAlias www.example.com example.com
DocumentRoot /var/www/html/example.com
ServerName www.example.com

RewriteEngine On
RewriteCond %{HTTP_HOST} ^example.com
RewriteRule (.*) http://www.example.com/$1 [R=301,L]

<directory /var/www/html/example.com>

Options +FollowSymLinks
RewriteEngine on
RewriteBase /
RewriteRule ^([0-9]+)(.*)/?$ /showitem.php?j=$1 [NC]

</directory>
</VirtualHost>

Проблема в том, что .* включает косая черта, которая уже есть в URL. Затем вы отправляете перенаправление на http://www.example.com/$1 который включает еще одну косую черту.

Одно из следующих действий решит вашу проблему:

RewriteRule (.*) http://www.example.com$1 [R=301,L]

или

RewriteRule /(.*) http://www.example.com/$1 [R=301,L]

Этого не произойдет внутри <Directory > блок или в .htaccess файл, потому что в обоих этих случаях в URI нет ведущей косой черты.

Попробуй это:

RewriteCond %{HTTP_HOST} ^example\.com
RewriteRule (.*) http://www.example.com$1 [R=301,L]

Вы можете легко избавиться от этого двойного /, позволив регулярному выражению части директивы "съесть" его:

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

Я никогда не слышал о hxxp протокол.

Ваш виртуальный хост отвечает как на example.com, так и на www.example.com запросы.

Исправить просто: добавьте отдельный виртуальный хост для www.example.com и удалите ServerAlias ​​с example.com.

Затем перенаправить постоянный / http://www.example.com/

Обратите внимание на преобладание косой черты как для источника, так и для цели - это ваша ошибка.

Я не собираюсь показывать вам, как исправить rewiterule, поскольку вам не следует его использовать.