我使用 Nginx (v= ) 配置了我的伺服器,當我嘗試使用 HEAD 請求時,我得到了 404 :
curl -I http://postera.in
HTTP/1.1 404 Not Found
Server: nginx/1.2.1
Date: Thu, 19 Dec 2013 09:51:53 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 1900
Connection: keep-alive
這是我的伺服器 Nginx 設定:
server {
listen 80;
server_name www.postera.in;
return 301 $scheme://postera.in$request_uri;
}
server {
listen 80;
server_name postera.in;
access_log /var/log/nginx/postera_manager.access.log;
error_log /var/log/nginx/postera_manager.error.log;
location / {
proxy_buffering off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_pass http://127.0.0.1:9800;
}
}
這個配置有什麼問題嗎?為什麼 HEAD 回傳 404 而不是 200 ?
謝謝您的協助 :)
答案1
好吧,我會回答這個問題。
問題不是來自 NGinx,而是來自後端,這裡,當請求 HEAD 並且路由檔案不包含 HEAD 時,PlayFramework 傳回 404。
為此開啟了一個錯誤:https://github.com/playframework/playframework/issues/2280
答案2
使用重點是什麼:
return 301 $scheme://postera.in$request_uri;
為什麼不是這個:
server_name www.example.com;
rewrite ^ http://example.com$request_uri? permanent;
您也可以在伺服器上的命令列中透過以下命令直接偵錯來自支援的回應,無需 nginx:
curl -I postera.in --resolve postera.in:9800:127.0.0.1
答案3
為了解決這樣的問題,我會在 Web 伺服器上開啟兩個終端來追蹤 /var/log/nginx/postera_manager.access.log 和 /var/log/nginx/postera_manager.error.log 以及在兩端執行 Wireshark ( curl 和Web 伺服器)。
同樣當伺服器響應兩者時http://postera.in和http://www.postera.in我會在這兩方面都嘗試一下curl。此外,我還會給 wget 或任何其他網路爬蟲(例如 Lynx)一個機會,讓其最終注意到差異。從差異中往往可以得出根本問題的定義。從根本原因出發,解決辦法自然就出來了。
只要沒有觀察到的事實支持,並跨越盡可能多的測試條件,我從不假設根本原因。
希望以上內容能夠幫助大家。此致, Philippe Vouters(法國楓丹白露 [幾乎所有職業都是軟體工程師支援])