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

StackOverflow https://stackoverflow.com/questions/215316

  •  03-07-2019
  •  | 
  •  

Вопрос

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

Решение

Пытаюсь ответить на ваш вопрос:Для отладки работы Apache вы можете настроить Логарифмический уровень на более низкий уровень (возможно 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 но ты уловил идею.Просто приспособьте это к вашему случаю.

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

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

</IfModule>

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

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

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

В любом случае, есть альтернатива для достижения «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>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top