Как отлаживать Apache mod_rewrite


171

У меня есть две основные проблемы с mod_rewrite:

1) Нет значимой ошибки при неправильном правиле

введите описание изображения здесь

2) Чтобы надежно протестировать каждую модификацию, я должен стереть кэш Chrome. Это не ракетостроение, но я должен нажать Ctrl + Shift + Delete, затем нажать OK, затем закрыть окно и перезагрузить.

Я хотел бы посмотреть, не желает ли кто-нибудь из гуру поделиться своими секретами для эффективного управления кодом mod_rewrite.


1
Пук, см. Stackoverflow.com/questions/9153262/… где я обсуждаю некоторые трюки станбдард.
TerryE

Ответы:


283

Одна хитрость заключается в том, чтобы включить журнал перезаписи. Чтобы включить его, попробуйте эти строки в основном конфиге apache или в текущем файле виртуального хоста ( не в .htaccess):

RewriteEngine On
RewriteLog "/var/log/apache2/rewrite.log"
RewriteLogLevel 3

С тех пор как Apache httpd 2.4 mod_rewrite директивы RewriteLog и RewriteLogLevel были полностью заменены новой конфигурацией ведения журнала для каждого модуля.

LogLevel alert rewrite:trace6

81
Вы не можете поместить это в .htaccess. Вы должны поместить его в конфигурацию VirtualHost.
Аттила Сереми,

7
Вы также должны иметь RewriteEngine Onраздел там, потому что если вы включите его (как я сделал) в .htaccessфайле, то ничего не будет зарегистрировано.
chacham15

12
где находится файл журнала в Apache 2.4?
Чарльз Джон Томпсон III

4
Вы найдете элементы журнала 2.4 в соответствующем журнале ошибок. Это может зависеть от вашей конфигурации, но настройки Debian / Ubuntu по умолчанию содержат их в /var/log/apache2/error.log
Иосия

10
Совет для профессионалов: не забудьте отключить перезапись. Если вы забудете, то достаточно быстро заполните свой жесткий диск, особенно на рабочем сервере.
Джон Хант

132

Директива LogRewrite, упомянутая Беном, больше не доступна в Apache 2.4. Вместо этого вам нужно использовать директиву LogLevel. Например

LogLevel alert rewrite:trace6

См. Http://httpd.apache.org/docs/2.4/mod/mod_rewrite.html#logging.


22
где файл журнала связан с этим?
Чарльз Джон Томпсон III

8
@CharlesJohnThompsonIII - файл журнала - это журнал ошибок (указанный в директиве ErrorLog). В документации вы можете получить только сообщения о переписывании с помощью grep:tail -f error_log|fgrep '[rewrite:'
billynoah

1
не забудьте перезапустить apache
бухгалтер م

1
Я должен был убедиться, что AllowOverrideбыл установлен All!
Майкл

25

Для базового разрешения URL-адресов используйте средство извлечения командной строки, например wgetили, curlчтобы выполнить тестирование, а не ручной браузер. Тогда вам не нужно очищать кеш; просто стрелка вверх и Enter в оболочке, чтобы повторно запустить тестовые выборки.


14
Еще одна хитрость заключается в использовании Chrome «Porn mode» (Ctl + Shift + N). Когда вы закрываете окно, любой кэшированный контекст сеанса удаляется.
TerryE

Я думаю, что Firefox "частный сеанс" просмотра также. Но вы говорите, что это контекст для каждого отдельного окна (то есть вы не закрываете Chrome?)
Kaz

2
AFAIK, Chrome и Ff отличаются тем, что Ff работает как отдельный процесс, который находится в частном режиме или нет. В Chrome каждая вкладка или окно выполняется как отдельный процесс и может работать индивидуально в частном режиме; закройте приватное окно / вкладку, и его контекст удаляется.
TerryE

1
PrivateTab аддон для FF делает вещь. Каждая вкладка работает индивидуально.
Джавид

Этот метод также показывает перенаправления! Хорошо для тех, у кого нет доступа к файлу конфигурации Apache компьютера.
Geof Sawaya

14

Есть тестер htaccess .

Он показывает, какие условия были проверены для определенного URL, какие соответствовали критериям и какие правила были выполнены.

Похоже, есть некоторые глюки, хотя.


2
Для меня это показало зеленое правило выполнения в последней строке без какого-либо кода.
Энди

@thombr Вы можете быть более точным, пожалуйста? Ссылка не работает? Или инструмент? Что именно не работает? И почему это актуально в контексте этого вопроса?
Энди

1
Это говорит мне, что URL преобразуется, как и ожидалось ... однако на реальном сервере я получаю 404
Майкл

@michael - проверенное правило - единственное, присутствующее в вашей конфигурации? Mod_rewrite действительно установлен и активен?
Энди

Оказывается, переопределения не были включены
Майкл

3

Исходя из ответа Бена, вы можете сделать следующее при запуске apache в Linux (Debian в моем случае).

Сначала создайте файл rewrite-log.load

/etc/apache2/mods-availabe/rewrite-log.load

RewriteLog "/var/log/apache2/rewrite.log"
RewriteLogLevel 3

Затем введите

$ a2enmod rewrite-log

с последующим

$ service apache2 restart

И когда вы закончили с отладкой ваших правил переписывания

$ a2dismod rewrite-log && service apache2 restart


Это не сработало. Я получаю sandino @ envy: ~ $ sudo service apache2 restart * Перезапуск веб-сервера apache2 [fail] * Сбой configache apache2. Вывод теста конфигурации был: AH00526: Синтаксическая ошибка в строке 1 /etc/apache2/mods-enabled/rewrite-log.load: Неверная команда 'RewriteLog', возможно, с ошибкой или определена модулем, не включенным в конфигурацию сервера
sandino

3
@sandino, какую версию apache вы используете? Кажется, этот синтаксис был изменен для 2.4, используйте вместо этого: LogLevel warn rewrite:trace8или LogLevel info rewrite:trace8где 8 может быть любым числом от 1 до 8
insaner
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.