У багатьох плакатів виникають проблеми з налагодженням своїх RewriteRule та RewriteCond висловлювань у своїх .htaccess
файлах. Більшість із них використовують спільний сервіс хостингу, тому не мають доступу до конфігурації кореневого сервера. Вони не можуть уникнути використання .htaccess
файлів для переписування і не можуть увімкнути RewriteLogLevel ", як багато респондентів пропонують. Також є багато .htaccess
специфічних підводних каменів, а обмеження недостатньо покриті. Налаштування локального стека тестів LAMP передбачає занадто багато кривої навчання для більшості .
Так мій Q ось як би ми рекомендуємо , щоб вони налагоджувати свої правила самі . Я надаю кілька пропозицій нижче. Інші пропозиції будуть вдячні.
Зрозумійте, що двигун mod_rewrite циклізує
.htaccess
файли . Двигун виконує цю петлю:do execute server and vhost rewrites (in the Apache Virtual Host Config) find the lowest "Per Dir" .htaccess file on the file path with rewrites enabled if found(.htaccess) execute .htaccess rewrites (in the user's directory) while rewrite occurred
Тож ваші правила виконуватимуться неодноразово, і якщо ви зміните шлях URI, то вони можуть закінчити виконання інших
.htaccess
файлів, якщо вони існують. Тому переконайтеся, що ви припините цю петлю, якщо потрібно, додавши додаткові,RewriteCond
щоб зупинити правила запуску. Також видаліть будь-які.htaccess
набори правил перезапису нижчого рівня, якщо явно не має наміру використовувати багаторівневі набори правил.Переконайтесь, що синтаксис кожного Regexp правильний , перевіряючи набір тестових шаблонів, щоб переконатися, що це правильний синтаксис, і виконує те, що ви задумали, з повним діапазоном тестових URI. Дивіться відповідь нижче для отримання більш детальної інформації.
Поступово будуйте свої правила в тестовому каталозі. Ви можете скористатися "виконати найглибший
.htaccess
файл на функції шляху", щоб створити тут окремий тестовий каталог (дерево) та набори правил налагодження, не викручуючи основні правила та не припиняючи роботу вашого сайту. Ви повинні додавати їх по черзі, тому що це єдиний спосіб локалізації відмов окремих правил.Використовуйте фіктивний скрипт для скидання змінних сервера та середовища . (Див. Лістинг 2 ) Якщо ваша програма використовує, скажімо,
blog/index.php
ви можете скопіювати цеtest/blog/index.php
і скористатися ним, щоб перевірити правила свого блогу уtest
підкаталозі. Ви також можете використовувати змінні середовища, щоб переконатися, що механізм перезапису в інтерпретації рядків заміни правильно, наприкладRewriteRule ^(.*) - [E=TEST0:%{DOCUMENT_ROOT}/blog/html_cache/$1.html]
і шукайте ці змінні REDIRECT_ * на дампі phpinfo. До речі, я скористався цим і виявив на своєму сайті, що мені довелося використовувати його
%{ENV:DOCUMENT_ROOT_REAL}
замість цього. У разі циклічного перенаправлення перемінника REDIRECT_REDIRECT_ * змінні відображають попередній пропуск. І т.д.Переконайтеся, що вас не покусає кешування браузера неправильним перенаправленням 301 . Дивіться відповідь нижче . Моя вдячність Ульріха Palha для цього.
Двигун перезапису здається чутливим до каскадних правил у
.htaccess
контексті (саме тамRewriteRule
результати призводять до заміни, і це потрапляє, хоча й до подальших правил), оскільки я виявив помилки з внутрішніми підзапитими (1) та неправильною обробкою PATH_INFO, яка часто може не допускати використання прапорів [NS], [L] та [PT].
Ще коментар чи пропозиції?
Лістинг 1 - phpinfo
<?php phpinfo(INFO_ENVIRONMENT|INFO_VARIABLES);