Как я могу отлаживать правила 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>

будет переведен на:

&lt;i&gt;text&lt;/i&gt;

который заставит браузер отображать:

<i>text</i>

вместо отображения слова "текст" курсивом:

<я > текст

Ответ 3

DWeb предлагает бесплатный инструмент со своим программным обеспечением, которое тестирует mod_rewrite. Просто скачайте, установите их софт, скопируйте .exe и удалите их программное обеспечение.