確定 Apache 指令強制重定向的工具
原始問題:
是否有任何用於調試 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
. 請注意,如果您有虛擬主機,則第一個是伺服器預設設置,因此也要檢查該錯誤日誌。