Инструменты, чтобы определить, что директива Apache вызывает перенаправления
Оригинальный вопрос:
Существуют ли какие-либо инструменты для отладки директив Apache, которые бы указывали, какая строка вызвала данное перенаправление?
Причина: у меня есть ALB на AWS. Я создал страницу healthCheck.php на всех экземплярах, но когда это происходит, результат всегда равен 301, что означает, что все экземпляры помечены как "нездоровые". Я мог бы поставить 301 как успех, но тогда я не знаю, действительно ли мой сервер не работает или нет. Проверка с помощью curl в том же VPC, это действительно так:
curl http://192.0.2.56/healthCheck.php
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>301 Moved Permanently</title>
</head><body>
<h1>Moved Permanently</h1>
<p>The document has moved <a href="http://www.192.0.2.56/healthCheck.php">here</a>.</p>
</body></html>
Поэтому я посмотрел на свой файл Apache Config и ничего не увидел. Он нетронут в стандартной конфигурации CentOS 7, с кучей виртуальных хостов внизу.
В качестве супербыстрого теста я точно так же настроил еще один ALB, вытащил сервер из официальной версии CentOS 7 AMI и проверил, а он не перенаправляет на www. Тогда я сравнил два результата. Буквально нет разницы в основных файлах, кроме виртуальных хостов. Я потратил много времени на поиски того, что это может быть. Есть идеи? Инструменты, которые я могу использовать для отслеживания каждого шага, пока не будет получен окончательный ответ?
Все серверы, получающие перенаправление 301, имеют порт 80, а ALB отключает HTTPS. ЛАМПА с PHP-FPM. Это потому, что все мои виртуальные хосты *:80?
Решение:
Основные инструменты для отладки перенаправлений можно найти ниже, но вот что стало причиной моей проблемы. Поскольку у меня были VirtualHosts, первый (по умолчанию) Virtual Host получил запрос. Это сайт Drupal, и мы включили его, чтобы добавить www:
RewriteCond %{HTTP_HOST} .
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ http%{ENV:protossl}://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Поэтому я просто добавил директиву, чтобы игнорировать мой healthCheck.php как
RewriteCond %{HTTP_HOST} .
RewriteCond %{REQUEST_URI} !healthCheck.php
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ http%{ENV:protossl}://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Затем я заметил, что он все еще выполняет перенаправление 301 с healthCheck.php на index.php, поэтому простой поиск в.htaccess показал, что это происходит, когда файл не найден. Я переместил чек в каталог VHost, и мы закончили.
Если php-fpm
не работает, я получаю 503 Сервис недоступен, и если httpd
вниз, я получаю Connection Refused
, Намного лучше и многословнее.
1 ответ
Добавить rewrite:trace
директива для LogLevel. Для получения более подробной информации см. Документацию Apache 2.4.
Также обратите внимание:
Использование высокого уровня журнала трассировки для mod_rewrite значительно замедлит работу вашего HTTP-сервера Apache! Используйте уровень журнала выше, чем trace2 только для отладки!
<VirtualHost *:80>
ServerName site1.org
ServerAlias www.site1.org
...
LogLevel alert rewrite:trace3
...
</VirtualHost>
Логи можно найти там, где вы указали ErrorLog
который обычно /var/log/httpd/error_log
, Обратите внимание, что если у вас есть виртуальные хосты, первым является сервер по умолчанию, так что проверьте этот журнал ошибок.