Как правильно настроить nginx Access-Control-Allow-Origin в заголовок ответа на основе заголовка Origin из запроса?
Я ищу настройку конфигурации nginx, которая устанавливает Access-Control-Allow-Origin
значение, полученное в Origin
.
Похоже, что метод *
не работает с Chrome, и несколько URL-адресов не работают с Firefox, поскольку это запрещено в спецификации CORS.
До сих пор единственным решением было установить Access-Control-Allow-Origin
на значение, полученное в начале (да, может быть реализована некоторая проверка).
Вопрос в том, как это сделать в nginx, желательно без установки дополнительных расширений.
set $allow_origin "https://example.com"
# instead I want to get the value from Origin request header
add_header 'Access-Control-Allow-Origin' $allow_origin;
Ответы
Ответ 1
Использование if
может иногда нарушать другую конфигурацию, например try_files
. Вы можете получить неожиданные 404s.
Вместо этого используйте карту
map $http_origin $cors_header {
default "";
"~^https?://[^/]+\.example\.com(:[0-9]+)?$" "$http_origin";
}
server {
...
location / {
add_header Access-Control-Allow-Origin $cors_header;
try_files $uri $uri/ /index.php;
}
...
}
Если это зло
Ответ 2
Я начинаю использовать это сам, и это линия в моей текущей конфигурации Nginx:
add_header 'Access-Control-Allow-Origin' "$http_origin";
Здесь задается заголовок, позволяющий происхождение запроса в качестве единственного разрешенного источника. Поэтому, когда бы вы ни отправились, это единственное место, которое разрешено. Поэтому он не должен сильно отличаться от разрешения "*", но он выглядит более конкретным с точки зрения браузера.
Кроме того, вы можете использовать условную логику в своей конфигурации Nginx для указания белого списка имен хостов. Вот пример из https://gist.github.com/Ry4an/6195025
if ($http_origin ~* (whitelist\.address\.one|whitelist\.address\.two)$) {
add_header Access-Control-Allow-Origin "$http_origin";
}
Я планирую попробовать эту технику на моем собственном сервере, чтобы включить белый список разрешенных доменов.