原始问题:
是否有任何用于调试 Apache 指令的工具可以告诉我哪一行导致了给定的重定向?
原因:我在 AWS 上有一个 ALB。我在所有实例上创建了一个 healthCheck.php 页面,但当它执行此操作时,结果始终为 301,这意味着所有实例都被标记为“不健康”。我可以将 301 设置为成功,但我不知道我的服务器是否真的已关闭。在同一个 VPC 中使用 curl 检查,情况确实如此:
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 配置文件,却什么也没看到。它在标准 CentOS 7 配置上没有变化,下面有一堆虚拟主机。
作为一个超快速测试,我以完全相同的方式设置了另一个 ALB,从官方 CentOS 7 AMI 中拉出一个服务器并进行测试,它不会重定向到 www。然后我比较了两个输出。除了虚拟主机之外,主要文件实际上没有区别。我花了很多时间挖掘它可能是什么。有什么想法吗?我可以使用哪些工具来追踪每个步骤,直到生成最终响应?
收到此 301 重定向的服务器都是端口 80,ALB 剥离了 HTTPS。带有 PHP-FPM 的 LAMP。是不是因为我的虚拟主机都是 *:80?
解决方案:
可以在下面找到用于调试重定向的常规工具,但以下是导致我的问题的原因。由于我拥有 VirtualHosts,因此第一个(默认)虚拟主机收到了请求。这是一个 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]
然后我注意到它仍然在执行从 healthCheck.php 到 index.php 的 301 重定向,因此在 .htaccess 中进行简单搜索发现,当找不到文件时就会发生这种情况。我将检查移到 VHost 目录中,我们就完成了。
如果php-fpm
宕机了,我会得到 503 服务不可用,如果httpd
宕机了,我会得到Connection Refused
。更好更详细。
答案1
rewrite:trace
向 LogLevel 添加指令。有关更多详细信息,请参阅Apache 2.4 文档。
另请注意:
对 mod_rewrite 使用高跟踪日志级别将显著降低 Apache HTTP 服务器的速度!仅在调试时使用高于 trace2 的日志级别!
<VirtualHost *:80>
ServerName site1.org
ServerAlias www.site1.org
...
LogLevel alert rewrite:trace3
...
</VirtualHost>
日志可以在您指定的位置找到,ErrorLog
通常是/var/log/httpd/error_log
。请注意,如果您有虚拟主机,则第一个是服务器默认值,因此也请检查该错误日志。