Как правильно настроить nginx Access-Control-Allow-Origin в заголовок ответа на основе заголовка Origin из запроса? - программирование

Как правильно настроить 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;
4b9b3361

Ответ 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";
}

Я планирую попробовать эту технику на моем собственном сервере, чтобы включить белый список разрешенных доменов.