Як налагодити 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.