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

103

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

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

8 ответов

136
Лучший ответ

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

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

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

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

Я предлагаю вам поместить его вскоре после RewriteEngine on.


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

откройте файл .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 будет записывать почти все детали перезаписи.


UPDATE

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

FROM Обновление до 2.4 из 2.2

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

Подробнее о LogLevel см. Директива LogLevel

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

RewriteLog "/path/to/rewrite.log"

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

LogLevel debug rewrite_module:debug
  • 0
    Итак, проблема в том, что я пытаюсь добавить rewriterule в файл .htaccess, и по какой-то причине он не использует его.
  • 0
    @macha попробуйте вышеуказанный метод. Если вы получаете внутреннюю ошибку сервера, это означает, что mod_rewrite (.htaccess) включен. Вы на общем хосте?
Показать ещё 10 комментариев
47

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

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

deny from all

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

  • 2
    Это самый простой тест, если вы не возражаете против того, чтобы ничего не работало в течение нескольких секунд, пока вы проверяете.
  • 0
    Да - мне потребовалось около секунды, чтобы убедиться, что сайт, на котором я работаю, не использует файлы .htaccess.
Показать ещё 1 комментарий
33

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

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

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

AllowOverride All

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

  • 0
    Благодарю. Я нашел соответствующий раздел в главном файле apache2.conf для дерева каталогов / var / www
5

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

DirectoryIndex test.html

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

3

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

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/

0

Чтобы ответить на первый вопрос из трех заданных, простой способ проверить, работает ли файл.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!

0

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

  • 7
    Я не думаю, что Apache не сможет запуститься или запустить, если будет плохой .htaccess, учитывая, что он не проверяет .htaccess, пока не появится запрос страницы.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню