Я настроил 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
директива.