Как мне решить, почему мои правила перезаписи не применяются apache?

У меня есть веб-приложение tomcat 6, работающее с apache httpd в качестве интерфейса. Я использую mod_proxy и mod_proxy_ajp для пересылки запросов на tomcat. На моем сервере работает Ubuntu. Теперь я пытаюсь использовать mod_rewrite для удаления ведущего www, чтобы мой канонический URL-адрес веб-сайта был http://domain.com, а не http://www.domain.com.

Я прочитал несколько руководств по использованию mod_rewrite, но я не могу заставить работать переписывание. Я попытался поместить правило перезаписи в файл .htaccess (после изменения моего файла / etc / apache / sites-available / default, чтобы установить AllowOverride all). Я пробовал поместить правило перезаписи в apache2.conf, httpd.conf и rewrite.conf. Я пробовал все это с включенным журналированием перезаписи. Файл журнала создается, но apache ничего в него не записал. Я подумал, что, возможно, mod_proxy каким-то образом препятствует использованию правил перезаписи, поэтому я попытался отключить и его ... но все равно не переписываю и ничего не записываю в журнал.

На данный момент я совершенно не знаю, что попробовать дальше. Как мне устранить неполадки, по которым apache не использует мои правила перезаписи?

Для справки, вот мои директивы перезаписи:

<IfModule mod_rewrite.c>

    RewriteEngine on
    RewriteCond %{HTTP_HOST} ^www.domain.com$ [NC]
    RewriteRule ^(.*)$ http://domain.com/$1 [R=301,L]
    RewriteLog "/var/log/apache2/rewrite.log"
    RewriteLogLevel 3

</IfModule>

Редактировать: ответы ниже полезны для моего конкретного случая, но, вероятно, не так полезны для сообщества в целом, как ответы о том, как вы устраняете неполадки директив apache в целом. Например, есть ли способ включить ведение журнала до такой степени, чтобы он сообщал мне, какие директивы применяются в каком порядке при поступлении запроса?

Редактировать 2: Теперь у меня есть дела. Мои виртуальные хосты были неправильно настроены, и у меня также не было правильного регулярного выражения перезаписи. Вот последние директивы перезаписи, с которыми мне пришлось работать:

<IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteCond %{HTTP_HOST} ^www\.domain\.com [NC]
        RewriteRule ^(.*)$ http://domain.com$1 [L,R=301]
</IfModule>

Вы удостоверились, что mod_rewrite загружен?

John Nilsson 18.10.2008 21:45

да. Я загрузил его с помощью «a2enmod rewrite», который установил символическую ссылку в модах с включенными модами так, чтобы они указывали на mod_rewrite.load в доступном для мода. Я также пытался намеренно ошибиться в написании одного из правил перезаписи (например, «Rewrite3Rule»), чтобы проверить, действительно ли правила подхватываются apache, и apache выдает мне сообщение об ошибке, как я и ожидал. Когда я исправляю орфографию и перезапускаю apache, он перезагружается нормально.

Myron Marston 18.10.2008 21:57
Как установить LAMP Stack 1/2 на Azure Linux VM
Как установить LAMP Stack 1/2 на Azure Linux VM
В дополнение к нашему предыдущему сообщению о намерении Azure прекратить поддержку Azure Database для MySQL в качестве единого сервера после 16...
7
2
10 744
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Попробуйте увеличить уровень ведения журнала до 9 (максимум). Убедитесь, что у apache есть соответствующие права на файл журнала (хотя, если он его создал, вполне вероятно, что он тоже может записывать в него). Попробуйте другое правило перезаписи без условий, например RewriteRule .* www.google.com [RL].

Хорошее предложение, но я все еще не вижу ни работающей перезаписи, ни чего-либо еще в журнале.

Myron Marston 18.10.2008 22:26

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

</IfModule>

Была такая же проблема с моим сервером, но это сработало

В каком контексте помещены эти правила? Например, вы можете разместить их на другом виртуальном хосте. Попробуйте разместить их вне любого контейнера, если у вас есть только один домен для тестирования.

В любом случае есть альтернатива достижению «no-www», заключающаяся в использовании двух виртуальных хостов, один для www, а другой для «no-www». www один перенаправляет на другой:

<VirtualHost *:80>
    ServerName www.domain.com
    Redirect permanent / http://domain.com
</VirtualHost>


<VirtualHost *:80>
    ServerName domain.com
    #The rest of the configuration (proxying, etc.)
</VirtualHost>

Я попытался разместить их в моем /etc/apache2/apache2.conf, /etc/apache2/httpd.conf, /etc/apache2/mods-available/rewrite.conf (который символически связан с / etc / apache2 / mods- включено). Насколько я понимаю, эти правила будут применяться всегда. У меня здесь только один домен / виртуальный хост.

Myron Marston 18.10.2008 22:29

Я попробовал ваше предложение, и apache жалуется на включение части порта 80 (порты : 80): [ошибка] VirtualHost *: 80 - смешивание * портов и не- с адресом NameVirtualHost не поддерживаются, результат не определен. Я вынул номер порта, и он перезапустился нормально, но без перенаправления.

Myron Marston 18.10.2008 22:30

Этот случай больше подходит для IRC, чем для Stack Overflow. Есть много конфигураций для отладки. Попробуйте #apache на irc.freenode.net, если ни одно из предложенных здесь предложений не работает.

Vinko Vrsalovic 19.10.2008 00:32
Ответ принят как подходящий

Пытаюсь ответить на твой вопрос: для отладки работы Apache вы можете настроить LogLevel на более низкий уровень (возможно, debug). Но даже если вы установите debug, если вы отключите журнал для рассматриваемого модуля, вы не получите от него никаких сообщений. Например, [RequestLogLevel][2] по умолчанию - 0, например, модуль не пишет никаких сообщений. Я вижу, вы установили его на 3, но, как сказал Роборг, измените его на 9, что, возможно, слишком мало для вашего случая.

Пытаюсь решить твою проблему: Попробуйте изменить способ перезаписи имени хоста, используя обратную форму - посмотрите, соответствует ли имя хоста, которое вы хотите, и, если нет, измените его на желаемое имя хоста. Как указано в Руководство по перезаписи URL - HTTP-сервер Apache на сайте Apache:

Canonical Hostnames

Description: The goal of this rule is to force the use of a particular hostname, in preference to other hostnames which may be used to reach the same site. For example, if you wish to force the use of www.example.com instead of example.com, you might use a variant of the following recipe. Solution:

# To force the use of 
RewriteEngine On
RewriteCond %{HTTP_HOST}   !^www\.example\.com [NC]
RewriteCond %{HTTP_HOST}   !^$
RewriteRule ^/(.*)         http://www.example.com/$1 [L,R]

В их примере они меняются с example.com на www.example.com, но идея вам понятна. Просто настройте его для своего случая.

В этом случае экранирование символа точки не имеет значения.

Vinko Vrsalovic 19.10.2008 00:30

Точка по-прежнему будет соответствовать точке, даже если экранированная точка будет соответствовать только фактической точке, а неэкранированная точка будет соответствовать чему-либо, включая точку, которой должна была соответствовать точка.

John Nilsson 19.10.2008 01:43

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