Как я могу отлаживать правила mod_rewrite?
Это случай "задавать вопрос и отвечать на него сам", который я публикую для всех, у кого есть такая же проблема.
У меня возникли проблемы с отладкой набора правил mod_rewrite в файле .htaccess на общем сервере, где я даже не мог получить доступ к журналам ошибок Apache. Я нашел опрятный способ их отладки, вот что:
-
Напишите короткий script, который просто распечатает переменные запроса. например в PHP:
<?='<pre>',htmlentities(print_r($_GET,true)),'</pre>'?>
- это все, что вам нужно.
-
Скажем, вы назовете это script "show.php" и поместите его в /public _html. Затем в вашем файле .htaccess укажите точку в вашем наборе правил, которая, по вашему мнению, может вызвать проблему, и вставьте это правило:
RewriteRule (.*) /show.php?url=$1 [END]
Эффект такой же, как вставка инструкции PRINT в обычной программе. Это даст вам знать, что (а) вы достигли этой точки в наборе правил и (б), что текущий переписан URL.
Это не так, как flash, как настоящий инструмент отладки, но он выполняет свою работу.
Если вы используете Apache < 2.3.9, вам нужно использовать [L]
вместо [END]
. В этом случае вы должны обратить внимание на то, что ваш набор правил не должен пытаться переписать "/show.php" на что-либо еще. Если это проблема, вы можете исправить ее, добавив это правило в самый верх:
RewriteRule ^show.php$ - [L]
... Не забудьте удалить его, когда вы закончите отладку!
Ответы
Ответ 1
Очень полезная проницательность. В течение многих лет я пытался выяснить, как отлаживать правила mod_rewrite без необходимости иметь корневой доступ и устанавливать правила в httpd.conf. Это делает это!
У вас есть одна незначительная ошибка в вашем PHP:
<?='<pre>',htmlentities(print_r($_GET),true),'</pre>'?>
В этом коде print_r() выводит все в $_GET в stdout, а затем возвращает значение true, которое htmlentities() выбирает в качестве первого аргумента. htmlentities() также получает литерал true как его второй аргумент, который является необязательным аргументом, который сообщает htmlentities(), чтобы или не вступать в операции с одиночными и/или двойными кавычками.
Я думаю, что вы намеревались:
<?='<pre>',htmlentities(print_r($_GET, true)),'</pre>'?>
Это говорит print_r() форматировать все в $_GET. Передача true, поскольку второй аргумент print_r() указывает ему не выводить результат на stdout, а вместо этого помещать результат в строку и возвращать эту строку в качестве значения print_r(). htmlentities() затем получает эту строку в качестве своего одного входного параметра и делает соответствующие подстановки, чтобы заставить браузер отображать строку как есть, а не позволять браузеру интерпретировать строку. НАПРИМЕР. -
<i>text</i>
будет переведен на:
<i>text</i>
который заставит браузер отображать:
<i>text</i>
вместо отображения слова "текст" курсивом:
<я > текст
Ответ 2
Другая возможность:
используйте этот онлайн-тестер htaccess:
http://htaccess.madewithlove.be/
Ответ 3
DWeb предлагает бесплатный инструмент со своим программным обеспечением, которое тестирует mod_rewrite. Просто скачайте, установите их софт, скопируйте .exe и удалите их программное обеспечение.