換了VPS之后的某一天,在Google管理員工具控制臺下看到了大量的"軟404"錯誤,查找了一些資料之后發現是自己在Nginx下配置404頁面的方法不對才導致了錯誤的產生,在此記錄一下Nginx下正確的404頁面配置方法。
404是一個相應代碼,表示"頁面無法找到"(Page Not Found),Google關于"軟404"給出的說法是:
Instead of returning a 404 response code for a non-existent URL, websites that serve "soft 404s" return a 200 response code.
就是說對于那些不存在的URL,服務器并沒有返回404(Page Not Found)代碼,而是返回了200(OK)代碼,而這是不正常的。
之后在其它的搜索結果里我又看到了這樣一段話
Soft 404s can occur as a result of configuration errors when an Error Document 404 is specified as an absolute path rather than a relative path.
看完之后恍然大悟,因為我的404自定義頁面是有圖片和CSS的,而圖片跟CSS都是以相對路徑(eg. /xxx/xxx)寫在頁面里的,所以為了能讓整站都能看到404頁面里的圖片,我就把404頁面在Nginx里定義成了絕對路徑(eg. //www.slyar.com/xxx/xxx),由于頁面被當成了外部頁面,所以會返回200代碼,由此產生了"軟404"錯誤。
知道了錯誤,那就好辦了。將404頁面的路徑定義為相對路徑,至于圖片和CSS,只要在頁面里使用絕對路徑即可。
Nginx下正確的404頁面定義方法:
1、VIM編輯Nginx配置文件,用了vhosts的就單獨改,沒用的直接改nginx.conf
vim /usr/local/nginx/conf/nginx.conf
or
vim /usr/local/nginx/conf/vhosts/slyar.com.nginx.conf
2、以相對路徑指定404頁面
server {#error_page 404 //www.slyar.com/404.htmlerror_page 404 /404.html;}
3、:wq保存退出,重新加載Nginx
/usr/local/nginx/sbin/nginx -s reload
4、重新檢查一下不存在的頁面,看是否返回404
curl -I //www.slyar.com/slyarHTTP/1.1 404 Not FoundServer: nginx/1.0.15Date: Mon, 27 Aug 2012 08:13:56 GMTContent-Type: text/htmlContent-Length: 2110Connection: keep-alive
5.隱藏Nginx出錯頁面及Header上的版本號
Nginx在出錯頁面,例如403和404頁上會默認顯示Nginx的版本號,這是非常不安全的,黑客可能會通過你的Nginx版本號獲知如何入侵你的服務器,因為特定版本的服務器程序可能會存在某些漏洞。
Nginx的版本號通常會出現在2個地方:
1、HTTP Header,例如 Server:nginx/1.x.x 等信息會暴露Web服務器所用軟件名稱以及版本號
2、在403和404等出錯頁面上,默認會顯示 Nginx 1.x.x 等版本信息
隱藏Nginx版本號非常簡單,官方已經給出了非常好的解決方案,利用server_tokens (Whether to send the Nginx version number in error pages and Server header)
打開配置文件Nginx.conf,然后在http一段中增加下面的參數
http {...其它配置server_tokens off;}
之后 nginx -s reload 重載Nginx配置,如此就可以隱藏掉Nginx的版本號了??梢允褂胏url自我測試。