htaccess 重定向僅在兩台伺服器之一上循環

htaccess 重定向僅在兩台伺服器之一上循環

我在兩台伺服器上安裝了一個網頁應用程式。在其中一台伺服器上,當我造訪主頁時,我在瀏覽器中收到「錯誤代碼:ERR_TOO_MANY_REDIRECTS」錯誤,而在另一台伺服器上一切正常。兩台伺服器都運行 apache 2.4。

apache 設定的哪一部分與重定向規則相關?我應該在哪裡尋找兩種配置之間的差異?

為了以防萬一,這裡是 htaccess 檔案:

<IfModule mod_rewrite.c>
  Options +FollowSymLinks
  RewriteEngine On

  # Get rid of index.php
  RewriteCond %{REQUEST_URI} /index\.php
  RewriteRule (.*) index.php?rewrite=2 [L,QSA]

  # Rewrite all directory-looking urls
  RewriteCond %{REQUEST_URI} /index.php/$
  RewriteRule (.*) index.php?rewrite=1 [L,QSA]

  # Try to route missing files
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} public\/ [OR]
  RewriteCond %{REQUEST_FILENAME} \.(jpg|gif|png|ico|flv|htm|html|php|css|js)$
  RewriteRule . - [L]

  # If the file doesn't exist, rewrite to index
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule ^(.*)$ index.php?rewrite=1 [L,QSA]

</IfModule>

# sends requests /index.php/path/to/module/ to "index.php"
# AcceptPathInfo On

# @todo This may not be effective in some cases
FileETag Size

<IfModule mod_deflate.c>
  AddOutputFilterByType DEFLATE text/text text/html text/plain text/xml text/css application/x-javascript application/javascript
</IfModule>

答案1

我經常發現這種不同的行為可以歸因於配置的差異。為此,我寫了一個腳本(httpd 轉儲配置)來壓平 httpd.conf,這樣我就可以對其進行比較,這樣我就可以審核叢集節點之間或環境之間(甚至透過 SSH)之間的差異

雖然它不會檢查 .htaccess 文件,但它仍然可以幫助找到容易被忽略的 .htaccess 檔案:

find $(httpd-dump-config | grep -i DocumentRoot | awk '{print $2}') -type f -name '.htaccess' -print

我不建議使用 ssh&diff 來嘗試上述操作,如下所示(因為轉義會殺了你)

比較兩台機器非.htaccess配置:

diff <(httpd-dump-config) \
     <(ssh webserverB.dom httpd-dump-config)

也有可能從程式碼中發出重定向(例如 PHP 發送 Location 標頭;例如它經常散落或以其他方式隱藏在我見過的許多 PHP 中)。

答案2

您在所有瀏覽器上都遇到此錯誤嗎?

每次我遇到這個問題總是不是某個特定瀏覽器中的小故障,就是奇怪的 URL 的結果。


重寫規則通常是這樣的

RewriteEngine on
RewriteCond   /your/docroot/%{REQUEST_FILENAME} !-f
RewriteRule   ^(.+)                             http://webserverB.dom/$**1

「這裡的問題是,這僅適用於 DocumentRoot 內的頁面。雖然您可以添加更多條件(例如還處理 homedirs 等),但有更好的變體:”

RewriteEngine on
RewriteCond   %{REQUEST_URI} !-U
RewriteRule   ^(.+)          http://webserverB.dom/$1**

「這使用了mod_rewrite 的URL 前瞻功能。結果是,這適用於所有類型的URL,並且是一種安全的方法。但它會對網路伺服器的效能產生影響,因為對於每個請求,都會有一個以上的內部子請求因此,如果您的網頁伺服器運行在功能強大的 CPU 上,請使用此伺服器;如果機器速度較慢,請使用第一種方法或更好的 ErrorDocument CGI 腳本。

您也可以查看擴充重定向

http://httpd.apache.org/docs/2.0/misc/rewriteguide.html

相關內容