Как я могу отладить правила mod_rewrite? - PullRequest
6 голосов
/ 18 октября 2011

Это случай «задать вопрос и ответить на него сам», который я публикую для всех, у кого такая же проблема.

У меня были некоторые проблемы при отладке набора правил mod_rewrite в файле .htaccess на общем сервере, где я даже не мог получить доступ к журналам ошибок Apache. Я нашел изящный способ их отладки, а именно:

  1. Напишите короткий скрипт, который просто печатает переменные строки запроса. например в PHP:

    <code><?='<pre>',htmlentities(print_r($_GET,true)),'
    '?>

    - это все, что вам нужно.

  2. Допустим, вы назвали этот скрипт "show.php" и поместили его в / public_html. Затем в файле .htaccess определите точку в вашем наборе правил, которая, по вашему мнению, может вызывать проблему, и вставьте это правило:

    RewriteRule (.*) /show.php?url=$1 [END]
    

Эффект такой же, как вставка оператора PRINT в обычную программу. Он сообщит вам, что (а) вы достигли этой точки в наборе правил и (б) каков текущий перезаписанный URL.

Это не так flash, как настоящий инструмент отладки, но он выполняет свою работу.

Если вы используете Apache <2.3.9, вам придется использовать <code>[L] вместо [END]. В этом случае следует обратить внимание на то, что ваш набор правил не должен пытаться переписать «/show.php» на что-либо другое. Если это проблема, вы можете исправить ее, добавив это правило в самом верху:

RewriteRule ^show.php$ - [L]

... Просто не забудьте удалить его, когда закончите отладку!

Ответы [ 2 ]

7 голосов
/ 13 июля 2012

Другая возможность:

используйте этот онлайн тестер htaccess:

http://htaccess.madewithlove.be/

4 голосов
/ 13 марта 2013

Очень полезное понимание.В течение многих лет я пытался выяснить, как отлаживать правила mod_rewrite без необходимости иметь root-доступ и помещать правила в httpd.conf.Это делает это!

В вашем PHP есть одна небольшая ошибка:

<code><?='<pre>',htmlentities(print_r($_GET),true),'
'?>

В этом коде print_r () выводит все в $ _GET дляstdout, а затем возвращает значение true, которое htmlentities () выбирает в качестве первого аргумента.htmlentities () также получает литеральное значение true в качестве второго аргумента, который является необязательным аргументом, который сообщает htmlentities (), стоит ли связываться с одинарными и / или двойными кавычками.:

<code><?='<pre>',htmlentities(print_r($_GET, true)),'
'?>

Это говорит print_r () отформатировать все в $ _GET.Передача true в качестве второго аргумента в print_r () говорит ему не выводить результат в stdout, а вместо этого помещать результат в строку и возвращать эту строку как возвращаемое значение print_r ().Затем htmlentities () получает эту строку в качестве одного входного параметра и выполняет соответствующие замены, чтобы заставить браузер отображать строку как есть, а не позволять браузеру интерпретировать строку.EG -

<i>text</i>

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

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

, что приведет к отображению в браузере:

<i>text</i>

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

текст

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...