Nginx

找不到遠端error_page時如何使用本地error_page?

  • May 18, 2020

我正在嘗試為我的 error_page 創建一個備份。基本上,邏輯應該如下所示:

  1. 載入 foobar.html
  2. 遠端伺服器上不存在 -> 從遠端伺服器載入 404.html 以顯示 404 頁面
  3. 遠端伺服器上不存在 -> 在本地文件系統上傳入 404.html

載入兩者localhost/404.htmllocalhost/global404.html正常工作,但是當我中斷localhost/404.html(通過從 http 伺服器中刪除文件)時,它不會global404.html像我期望的那樣顯示頁面。

server {
   listen 80;
   server_name example.com www.example.com;
   proxy_intercept_errors on;

   location / {
       proxy_pass http://localhost:3000;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-For $remote_addr;
       error_page 404 /404.html;
   }

   location /404.html {
       proxy_pass http://localhost:3000/404.html;
       error_page 404 /global404.html;
   }

   location /global404.html {
       root /usr/share/nginx/html;
   }
}

當我點擊時,上面的工作正常http://localhost/404.html(當 404.html 文件位於遠端伺服器上時,它顯示,當我刪除文件時,它會載入 global404.html 文件)。

但是,當我鍵入一個不存在的頁面時,我只會得到預設的 nginx 404 頁面。

由於對該問題留下的評論措辭,我設法找到了recursive_error_pages允許 cascading/recursive 的選項error_pages。我覺得在文件中遺漏了它很愚蠢。

但是,簡單地做

server {
   listen      80;
   server_name example.com www.example.com;
   proxy_intercept_errors on;
   recursive_error_pages on;

   location / {
       proxy_pass http://localhost:3000;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-For $remote_addr;
       error_page 404 /404.html;
   }

   location /404.html {
       proxy_pass http://localhost:3000/404.html;
       error_page 404 /global404.html;
   }

   location /global404.html {
       root /usr/share/nginx/html;
   }
}

發揮了魅力。我喜歡 nginx。

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