Nginx

虛擬主機的 nginx 自定義 404 錯誤頁面

  • October 29, 2016

我在 nginx 上執行了一些虛擬主機,我希望它們每個都有自己的自定義 404 頁面。每個虛擬主機都有自己的 nginx.conf,我包括我的全域 nginx.conf。

在我目前無法正常工作的特定虛擬主機的配置文件中,配置塊如下所示:

server{
   listen 80;
   server_name www.foo.com;
   expires     1M;
   access_log  /srv/www/foo/logs/acces.log;
   error_log   /srv/www/foo/logs/error.log;

   error_page 404 /404.html;

   location / {
       root    /srv/www/foo/public_html;
       index   index.html;
       rewrite ^/(.*)/$ /$1 permanent;
       try_files "${uri}.html" $uri $uri/ =404;
   }

   location = /404.html {
       internal;
   }       
}

404’ing 本身很好,但是當返回 404 狀態程式碼時,會顯示預設的 nginx 404 頁面,而不是位於站點根目錄中的自定義頁面 404.html。

我已經嘗試通過文件系統和站點的 URI 到錯誤頁面的絕對路徑,並且我嘗試將 error_page 指令放在 location 塊中。這些都不起作用。我懷疑問題出在我用來“美化”我的 URL 的 rewrite 和 try_files 組合中。

首先,將根指令設置在 location 塊之外 - 在這種情況下,在 error_page 指令之上。請參閱 nginx陷阱頁面。這樣做的原因是許多指令(包括 error_page)需要知道相對於某些東西的路徑 - 並且所有路徑都被假定為相對的(即 /404.html 不在文件系統的根目錄中 - 它是相對於您的文件的根)。

server{
   #listen 80; - not needed
   server_name www.foo.com;
   root    /srv/www/foo/public_html;
   expires     1M;
   access_log  /srv/www/foo/logs/access.log;
   error_log   /srv/www/foo/logs/error.log;

   error_page 404 /404.html;

   location / {
       index   index.html;
       rewrite ^/(.*)/$ /$1 permanent;
       try_files "${uri}.html" $uri $uri/ =404;
   }

   location = /404.html {
       internal;
   }       
}

如果上述方法不能解決您的錯誤,請增加您的error_log的詳細程度(例如到“資訊”)並查看當您遇到 404 時 nginx 實際服務的頁面。

引用自:https://serverfault.com/questions/354803