Как отладить .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
ThinkingMonkey
источник
Хорошо, проблема в том, что я пытаюсь добавить 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, файлы в этой папке вообще не загружаются.

caitriona
источник
4
Это простейший тест, если вы не против, чтобы в течение нескольких секунд ничего не работало, пока вы проверяете.
Mordred
1
Да, мне потребовалось около секунды, чтобы убедиться, что сайт, над которым я работал, не использовал файлы .htaccess.
Bonh
1
Спасибо, работает как шарм :) Сэкономила время на отладке!
Martijn van Hoof
32

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

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

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

AllowOverride All

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

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

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

DirectoryIndex test.html

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

Cez
источник
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!

Pētera
источник
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 до тех пор, пока не поступит запрос страницы.
Эндрю