Nginx

4xx 響應程式碼的 Nginx 反向代理問題

  • October 5, 2017

我已將 nginx 配置為代理來自埠 8000 的請求,以路由到不同的 ip。在配置中,我還添加了 Access-control-Allow-Origin 標頭。如果伺服器使用 2xx 響應程式碼進行響應,這可以正常工作。但是如果伺服器響應 4xx 響應碼,它不包含下面提到的標頭

server {
listen *:8000;

ssl                     on;
ssl_certificate         /etc/nginx/ssl/axis.crt;
ssl_certificate_key     /etc/nginx/ssl/axisPrivate.key;
server_name             website.com;
ssl_protocols           SSLv2 SSLv3 TLSv1;
ssl_ciphers             ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv3:+EXP;
access_log /var/log/nginx/nginx.vhost.access.log;
error_log /var/log/nginx/nginx.vhost.error.log;

location / {
   proxy_set_header Host $host;
   proxy_set_header X-Real-IP $remote_addr;
   proxy_pass https://api;
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
   proxy_ssl_session_reuse off;
   proxy_set_header Host $http_host;

   proxy_redirect off;
   proxy_intercept_errors off;  
# Simple requests
   if ($request_method ~* "(GET|POST|PUT)") {
     add_header "Access-Control-Allow-Origin" "https://website.com";
   }

   # Preflighted requests
   if ($request_method = OPTIONS ) {
     add_header "Access-Control-Allow-Origin"  "https://website.com";
     add_header "Access-Control-Allow-Methods" "GET,PUT,POST, OPTIONS, HEAD";
     add_header "Access-Control-Allow-Headers" "Authorization, Origin, X-Requested-With, Content-Type, Accept,access-control-allow-methods,access-control-allow-origin";
     return 200;
   }

}
}

upstream api {
server ip:port;
}

由於標頭缺少 Access-Control-Allow-Origin,因此瀏覽器會阻止對響應執行的任何操作。

瀏覽器中的錯誤日誌:

POST https://website.com:8000/employee 409 ()
EmployeeRegistration:1 Failed to load https://website.com:8000/employee: No 'Access-Control-Allow-Origin' header is present on the requested resource. 
Origin 'https://website.com' is therefore not allowed access. The response had HTTP status code 409.

這是預期的行為

語法: add_header 名稱值

$$ always $$; 預設值:- 上下文:http、伺服器、位置,如果在位置

如果響應程式碼等於 200、201 (1.3.10)、204、206、301、302、303、304、307 (1.1.16、1.0.13) 或 308 (1.13),則將指定欄位添加到響應標頭.0)。該值可以包含變數。

可能有幾個add_header指令。當且僅當add_header在目前級別上沒有定義任何指令時,這些指令才從上一層繼承。

如果always指定了參數(1.7.5),則無論響應程式碼如何,都會添加標頭欄位。

您需要指令中的always關鍵字。add_header

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