Centos

確定 Apache 指令強制重定向的工具

  • August 2, 2019

原始問題:

是否有任何用於調試 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 Config 文件看,什麼也看不到。它在標準 CentOS 7 配置上沒有受到影響,下面有一堆虛擬主機。

作為一個超級快速的測試,我以完全相同的方式設置了另一個 ALB,從官方 CentOS 7 AMI 中提取了一個伺服器,並進行了測試,它沒有重定向到 www。所以我比較了兩個輸出。除了虛擬主機之外,主要文件實際上沒有區別。我花了很多時間探勘它可能是什麼。有任何想法嗎?在生成最終響應之前,我可以使用哪些工具來追踪每個步驟?

獲得此 301 重定向的伺服器都是埠 80,而 ALB 剝離了 HTTPS。帶有 PHP-FPM 的燈。是因為我的虛擬主機都是*: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 Service Unavailable,如果httpd宕機,我得到Connection Refused. 更好,更詳細。

向 LogLevel添加rewrite:trace指令。有關更多詳細資訊,請參閱 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. 請注意,如果您有虛擬主機,則第一個是伺服器預設設置,因此也要檢查該錯誤日誌。

引用自:https://serverfault.com/questions/977761