Як налагодити Apache mod_rewrite


171

У мене дві основні проблеми з mod_rewrite:

1) Немає жодної суттєвої помилки, коли у мене є недійсне правило

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

2) Щоб надійно перевірити кожну модифікацію, я повинен стерти кеш хрому. Це не ракетна наука, але мені потрібно натиснути Ctrl + Shift + Delete, потім натиснути ОК, потім закрити вікно та перезавантажити.

Я хотів би дізнатися, чи готовий хтось із гуру поділитися своїми секретами щодо ефективного управління кодом mod_rewrite.


1
Puk, див. 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.
Attila Szeremi

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

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

4
Ви знайдете елементи 2.4 журналу у відповідному журналі помилок. Це може залежати від вашої конфігурації, але налаштування Debian / Ubuntu за замовчуванням мають їх у /var/log/apache2/error.log
Josiah

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зробіть тестування, а не браузер вручну. Тоді вам не доведеться очищати жоден кеш; просто стрілка вгору та введіть оболонку, щоб повторно запустити тестові результати.


14
Ще одна хитрість - використовувати Chrome "Porn mode" (Ctl + Shift + N). Коли ви закриваєте вікно, будь-який контекст сеансу кешування записується.
TerryE

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

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

1
Пристосування PrivateTab для FF робить це. Кожна вкладка працює індивідуально.
Джавід

Цей метод також показує переспрямування! Приємно для тих, хто не має доступу до файлу конфігурації машини apache.
Геоф Савейя

14

Там тестер htaccess .

Він показує, які умови були протестовані для певної URL-адреси, які відповідали критеріям та які правила виконувались.

Це, здається, має деякі збої.


2
Для мене це показало зелене виконане правило в останньому рядку без коду.
Енді

@thombr Ви можете бути точнішими, будь ласка? Посилання не працює? Або інструмент? Що саме не працює? І чому це актуально в контексті цього питання?
Енді

1
Це говорить мені, що URL-адреса перетворюється так, як очікувалося ... однак на фактичному сервері я отримую 404
Michael

@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 переписати-журнал

слідом за ним

$ service apache2 перезапуск

І коли ви закінчили з налагодженням своїх правил перезапису

$ a2dismod перезаписати журнал та && послуга перезапустити апаш2


Це не вийшло. Я отримую sandino @ заздрість: ~ $ sudo service apache2 перезапуск * Перезапуск веб-сервера apache2 [провал] * Не вдалося настроїти налаштування 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
божевільний
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.