2010-11-11 64 views
1

我正在將工作的Apache/mod-php網站移動到nginx/php-fpm。使用nginx/php-fpm,瀏覽器有時會忽略位置標題。爲什麼?

在Apache/mod-php下,我可以使用header("Location: $url");將瀏覽器重定向到其他頁面,例如登錄嘗試之後。切換到nginx/php-fpm之後,瀏覽器將不再遵循某些頁面上的重定向。我使用Firebug和Httpfox確認在響應中實際上正在接收標題「位置:[url]」。這種行爲也出現在Chrome中(未在IE中測試過)。因此,我做了一些實驗,閱讀了一些關於http的東西,並使其工作,但我不確定它爲什麼有效(或爲什麼不)。

我想出的解決方案是在「Location:[url]」標題前發送一個「Status:303」標題。這適用於Chrome和Firefox,當我發送「狀態:200」或忽略狀態標題時忽略了位置標題,但在將其更改爲「狀態303」時進行了重定向。它在Apache下與Status 200一起工作。

是否需要使用位置標題的狀態標題?或者是Apache做其他事情來使它工作?除了header("Status: 303");這條線以外,我還沒有改變任何涉及的php代碼。這裏必須有其他的東西,但我不知道它會是什麼。

任何想法?

回答

2

Location標題本身並不觸發瀏覽器重定向。重定向實際上是由3xx系列中的HTTP響應代碼觸發的。 w3c has explanations for all http response codes

Apache自動在響應中看到Location標題,並強制響應代碼爲300系列,前提是您之前沒有設置自己的響應代碼。 Nginx不會這樣做 - 它希望你自己設置正確的響應代碼。

您可以強制PHP發送一個修改後的HTTP響應代碼:

<?php 
    header("HTTP/1.0 301 Moved Permanently"); 
?> 

...然後,當然,你需要確保你仍然發送您的Location後發送上面顯示的HTTP/1.0...行。

+0

您的代碼行丟失了,但我明白現在發生了什麼。感謝您的解釋。 – Mnebuerquo 2010-11-12 00:07:20