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

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

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

Ответ 1

Введите некоторое нежелательное значение в .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

Ответ 2

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

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

deny from all

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

Ответ 3

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

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

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

AllowOverride All

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

Ответ 4

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

DirectoryIndex test.html

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

Ответ 5

Если у вас есть доступ к каталогу 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 работают правильно.

Ответ 6

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

http://htaccess.mwl.be/

Ответ 7

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

Ответ 8

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