Nginx

為什麼 Nginx 的 proxy_intercept_errors 指令需要重寫才能正常工作?

  • December 14, 2016

以下是 Nginx 伺服器配置範例。如果沒有“魔法護身符”位置塊,代理錯誤內容會導致 Nginx 404 頁面,而不是提供自定義的錯誤頁面。

刪除 proxy_intercept_errors 指令會提供帶有正確 http 錯誤程式碼標頭的正確代理錯誤頁面。

無論魔法護身符是否存在,非代理錯誤頁面都會正確呈現。

關於到底發生了什麼的任何想法?

server {
   server_name     mydomain.com "";
   listen          80;
   root            /var/www;
   error_page      400 401 402 403 404 500 501 502 503 504 /admin/error_page.htm;
   proxy_intercept_errors on;

   location /proxy/ {
       proxy_read_timeout  60s;
       proxy_set_header    Host $host;
       proxy_pass          http://myservers;
   }

   location /test404/ {
       return 404;
   }

   location /admin/ {    # this line constitute a magical talisman that fixes proxied error interception(???)(!)
       rewrite ^(/admin)(.*)$ /admin$2 break;
   }
}

很抱歉,這個答案來晚了,但到目前為止,使用目前的 v1.8.1 穩定版本,您提供的配置應該可以在沒有任何護身符的情況下工作。

如果您提供了您正在試驗的版本,則可以查看是否已糾正錯誤或配置是否存在缺陷。

我建議你仔細檢查你的配置,因為你絕對不需要這個/admin/位置,也不需要它包含的rewrite指令。請特別注意刪除不屬於此測試的所有內容(並且您沒有顯示),因為它可能會干擾。

作為最後的手段,您可以嘗試以下成功測試的配置片段,然後慢慢整合更改,看看結果與預期不同:

server {
   listen      80;
   listen      [::]:80;
   server_name example.org;

   location /proxy {
       return 418 "Host: $host, Connection: $http_connection";
   }
}

server {
   listen      80;
   listen      [::]:80;
   server_name example.com;

   root /var/ious/files;

   error_page 418 = /error_page.html;
   proxy_intercept_errors on;

   location /proxy {
       proxy_pass http://example.org;
   }
}

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