Назад | Перейти на главную страницу

Проблема обратного прокси-сервера Nginx для кода ответа 4xx

Я настроил 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 имя значение [всегда];

По умолчанию: - Контекст: 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 директива.