web-dev-qa-db-ja.com

4xx応答コードのNginxリバースプロキシの問題

ポート8000​​に届くリクエストをプロキシし、別のIPにルーティングするようにnginxを構成しました。構成では、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.
2
Sam

これは 意図された動作

構文:add_headername value[常に];

デフォルト:—コンテキスト: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)、応答コードに関係なくヘッダーフィールドが追加されます。

add_headerディレクティブにはalwaysキーワードが必要です。

3
drookie