У багатьох плакатів виникають проблеми з налагодженням своїх 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);