2012-10-27 126 views
1
正確的HTTP 404頭

可能重複:
404 header - HTTP 1.0 or 1.1?發送使用PHP

我有一個簡單的PHP代碼中使用時,使用header

header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found"); 
echo $_SERVER["SERVER_PROTOCOL"]; 

其送404,但curl命令和強制1.0,它返回ñ..

curl -0 -v 'http://www.example.com/test.php' 


> GET /test.php HTTP/1.0 

< HTTP/1.1 404 Not Found 
< Server: nginx 
< Date: Sat, 27 Oct 2012 08:51:27 GMT 
< Content-Type: text/html 
< Connection: close 
< 
* Closing connection #0 
HTTP/1.0 

正如你可以看到$_SERVER["SERVER_PROTOCOL"]是1.0,但頭給我1.1,是什麼原因?

+0

@戈登,當你說它是重複的時候,請仔細閱讀。 – Ryan

+0

你可以使用htaccess \ –

回答

-1

如果你使用nginx的和PHP之間的FastCGI(你可能是),你應該使用

header("Status: 404 Not Found"); 

通過PHP's documentation for header的建議。

+0

這樣做是的我試過了,仍然迴應1.1 – Ryan

+0

'$ _SERVER [「SERVER_PROTOCOL」]'只是與請求一起發送的協議版本,不一定是響應的版本與...一起發送。使用該標題應該適當地設置你的404。 –

1

偉大的問題。

你必須明白,這不是特定於PHP的東西,所以不要認爲有bug或什麼的。這是特定於:

  1. Web服務器的配置
  2. 客戶端(認爲瀏覽器)配置

通常客戶,發送到Web服務器的請求時,指出它們所支持的協議。網絡服務器然後用它支持的協議或它被配置的響應來響應。

在你的PHP代碼中,當你刷新404頭時,你提示服務器要使用哪個協議。你不能強迫它 - 至少我沒有意識到強制它從PHP的方式。 Web服務器將最終滿足自己和請求客戶端支持的最高協議。

除非客戶強迫它,否則nginx將始終通過HTTP/1.1進行響應。我沒有意識到像Apache這樣的配置方法。但這就是你所看到的行爲的原因。

也許你應該編輯你的問題,或者打開一個新的問題,讓它更具體到nginx,因爲就像我解釋過的,這不是PHP的問題。這樣更多的人可以找到問題並提供幫助。

+0

我正在使用nginx/php5-fpm,問題是當客戶端告訴他們只支持1.0時,用1.1迴應還是有意義的? – Ryan

+0

@Yoga是的,我剛剛意識到,你發佈的回覆頭文件清楚地表明你正在使用nginx。對於那個很抱歉 :)。無論如何,看到我的編輯細節。 – 9ee1

+0

我已經指定了'curl'命令我只想和'http 1聊天。0',我也同意這是'nginx'的問題,然後我會在serverfault報告。謝謝。 – Ryan