Как отладить .htaccess RewriteRule не работает


115

У меня есть RewriteRuleв .htaccessфайле , который не делает ничего. Как мне решить эту проблему?

  • Как я могу проверить .htaccess, читает ли файл и выполняет ли его Apache? Могу ли я написать эхо-сообщение "он работает", если я его напишу, где эта строка будет отражена эхом?
  • Если .htaccessфайл не используется, как я могу заставить его использовать Apache?
  • Если .htaccessиспользуется, но мой RewriteRuleвсе еще не действует, что еще я могу сделать для отладки?

Ответы:


144

Введите какое-нибудь нежелательное значение в ваше, .htaccess например foo bar, sakjnaskljdnas любое ключевое слово, не распознаваемое htaccess, и посетите свой URL. Если он работает, вы должны получить

внутренняя ошибка сервера 500

Внутренняя ошибка сервера

Сервер обнаружил внутреннюю ошибку или неправильную конфигурацию и не смог выполнить ваш запрос ....

Предлагаю сразу же поставить RewriteEngine on.


Поскольку вы на своей машине. Я предполагаю, что у вас есть доступ к .confфайлу apache .

откройте .confфайл и найдите строку, похожую на:

LoadModule rewrite_module modules/mod_rewrite.so

Если он закомментирован (#), раскомментируйте и перезапустите apache.


В журнал переписать

RewriteEngine On
RewriteLog "/path/to/rewrite.log"
RewriteLogLevel 9

Поместите указанные выше 3 строки в свой virtualhost. перезапустите httpd.

RewriteLogLevel 9Использование высокого значения для уровня значительно замедлит работу вашего сервера Apache! Используйте файл журнала перезаписи на уровне выше 2 только для отладки! Уровень 9 регистрирует почти каждую деталь журнала перезаписи.


ОБНОВИТЬ

В Apache 2.4 все изменилось:

С Обновление до 2.4 с 2.2

В RewriteLog и RewriteLogLevel директивы были удалены. Эта функциональность теперь предоставляется путем настройки соответствующего уровня ведения журнала для модуля mod_rewrite с помощью директивы LogLevel . См. Также раздел ведения журнала mod_rewrite.

Дополнительные сведения о LogLevel см. В Директиве LogLevel.

вы можете выполнить

RewriteLog "/path/to/rewrite.log"

таким образом сейчас

LogLevel debug rewrite_module:debug

Хорошо, проблема в том, что я пытаюсь добавить rewriterule в файл .htaccess, но по какой-то причине он его не использует.
macha

@macha попробуйте описанный выше метод. Если вы получаете внутреннюю ошибку сервера, это означает, что включен mod_rewrite (.htaccess). Вы на общем хосте?
ThinkingMonkey

Нет, я работаю на своем локальном хосте, вы знаете, когда загружается файл .htaccess? Я думал, что Apache прочитает это первым
macha

Файлы @macha .htaccess никогда не загружаются. К ним обращается (если есть) apache, когда вы пытаетесь получить доступ к странице, которая присутствует в этой папке.
ThinkingMonkey

Хорошо, мой вопрос заключался в том, что если кто-то запрашивает веб-страницу, apache напрямую переходит к сценариям на стороне сервера или будет искать файл .htaccess в этой папке, а затем продолжить ??
macha

52

Ответ «Введите какое-то нежелательное значение» не помог мне, мой сайт продолжал загружаться, несмотря на введенный мусор.

Вместо этого я добавил следующую строку в начало файла .htaccess:

deny from all

Это быстро сообщит вам, перехватывается ли .htaccess или нет. Если используется .htaccess, файлы в этой папке вообще не загружаются.


4
Это простейший тест, если вы не против, чтобы в течение нескольких секунд ничего не работало, пока вы проверяете.
Mordred

1
Да, мне потребовалось около секунды, чтобы убедиться, что сайт, над которым я работал, не использовал файлы .htaccess.
Bonh

1
Спасибо, работает как шарм :) Сэкономила время на отладке!
Martijn van Hoof

32

Обычно любое изменение в .htaccess должно иметь видимые последствия. Если эффекта нет, проверьте файлы конфигурации apache, например:

<Directory ..>
    ...
    AllowOverride None
    ...
</Directory>

Следует изменить на

AllowOverride All

И вы сможете изменять директивы в файлах .htaccess.


Спасибо. Я нашел соответствующий раздел в главном файле apache2.conf для дерева каталогов / var / www
Тим Ричардсон

6

Возможно, более логичным методом было бы создать файл (например, test.html), добавить контент, а затем попытаться установить его в качестве страницы индекса:

DirectoryIndex test.html

По большей части правило .htaccess переопределяет конфигурацию Apache, где работает на уровне каталога / файла.


4

Чтобы ответить на первый из трех заданных вопросов, простой способ проверить, работает ли файл .htaccess или нет, - это вызвать пользовательскую ошибку в верхней части файла .htaccess:

ErrorDocument 200 "Hello. This is your .htaccess file talking."
RewriteRule ^ - [L,R=200]

Что касается вашего второго вопроса, если файл .htaccess не читается, возможно, что основная конфигурация сервера Apache AllowOverrideустановлена ​​на None. В документации Apache есть советы по устранению неполадок для этого и других случаев, которые могут препятствовать вступлению в силу .htaccess.

Наконец, чтобы ответить на ваш третий вопрос, если вам нужно отладить определенные переменные, на которые вы ссылаетесь в своем правиле перезаписи или используете выражение, которое вы хотите оценить независимо от правила, вы можете сделать следующее:

Выведите переменную, на которую вы ссылаетесь, чтобы убедиться, что она имеет ожидаемое значение:

ErrorDocument 200 "Request: %{THE_REQUEST} Referrer: %{HTTP_REFERER} Host: %{HTTP_HOST}"
RewriteRule ^ - [L,R=200]

Проверьте выражение независимо друг от друга, поместив его в <If>директиве. Это позволяет вам убедиться, что ваше выражение написано правильно или соответствует, когда вы ожидаете:

<If "%{REQUEST_URI} =~ /word$/">
    ErrorDocument 200 "Your expression is priceless!"
    RewriteRule ^ - [L,R=200]
</If>

Удачной отладки .htaccess!


3

Если у вас есть доступ к каталогу bin apache, который вы можете использовать,

httpd -M чтобы сначала проверить загруженные модули.

 info_module (shared)
 isapi_module (shared)
 log_config_module (shared)
 cache_disk_module (shared)
 mime_module (shared)
 negotiation_module (shared)
 proxy_module (shared)
 proxy_ajp_module (shared)
 rewrite_module (shared)
 setenvif_module (shared)
 socache_shmcb_module (shared)
 ssl_module (shared)
 status_module (shared)
 version_module (shared)
 php5_module (shared)

После этого простые директивы, такие как Options -Indexesили deny from all, подтвердят, что .htaccess работает правильно.


1

Чтобы проверить свои правила перезаписи htaccess, просто введите URL-адрес, к которому вы применяете правила, поместите содержимое вашего htaccess в большую область ввода и нажмите кнопку «Проверить».

http://htaccess.mwl.be/


-1

Почему бы не поместить мусор в файл .htaccess и не попробовать перезагрузить apache. Если apache не запускается, вы знаете, что он работает. Удалите мусор, затем перезагрузите apache, если он загружает правильно настроенный вами .htaccess.


7
Я не думаю, что Apache не запустится или не запустится, если будет плохой .htaccess, учитывая, что он не проверяет .htaccess до тех пор, пока не поступит запрос страницы.
Эндрю
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.