Как мне выяснить, почему мои правила перезаписи не применяются Apache? - PullRequest
7 голосов
/ 18 октября 2008

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

Ответы [ 4 ]

4 голосов
/ 18 октября 2008

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

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

Канонические имена хостов

Описание : Целью этого правила является принудительное использование определенного имени хоста в предпочтение другим именам хостов, которые может быть использован для достижения того же сайта. Например, если вы хотите заставить использование www.example.com вместо example.com, вы можете использовать вариант следующего рецепта. Решение:

# 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, но у вас есть идея. Просто настройте его для вашего случая.

1 голос
/ 18 октября 2008

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

</IfModule>

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

0 голосов
/ 18 октября 2008

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

В любом случае, существует альтернатива для достижения 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>
0 голосов
/ 18 октября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...