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

Попробуйте увеличить уровень ведения журнала до 9 (максимум).
Убедитесь, что у apache есть соответствующие права на файл журнала (хотя, если он его создал, вполне вероятно, что он тоже может записывать в него).
Попробуйте другое правило перезаписи без условий, например RewriteRule .* www.google.com [RL].
Хорошее предложение, но я все еще не вижу ни работающей перезаписи, ни чего-либо еще в журнале.
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- включено). Насколько я понимаю, эти правила будут применяться всегда. У меня здесь только один домен / виртуальный хост.
Я попробовал ваше предложение, и apache жалуется на включение части порта 80 (порты : 80): [ошибка] VirtualHost *: 80 - смешивание * портов и не- с адресом NameVirtualHost не поддерживаются, результат не определен. Я вынул номер порта, и он перезапустился нормально, но без перенаправления.
Этот случай больше подходит для IRC, чем для Stack Overflow. Есть много конфигураций для отладки. Попробуйте #apache на irc.freenode.net, если ни одно из предложенных здесь предложений не работает.
Пытаюсь ответить на твой вопрос: для отладки работы 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, но идея вам понятна. Просто настройте его для своего случая.
В этом случае экранирование символа точки не имеет значения.
Точка по-прежнему будет соответствовать точке, даже если экранированная точка будет соответствовать только фактической точке, а неэкранированная точка будет соответствовать чему-либо, включая точку, которой должна была соответствовать точка.
Вы удостоверились, что mod_rewrite загружен?