Разрешение запросов перекрестного происхождения (CORS) на Nginx для 404 ответов


26

Я использую Nginx для обслуживания статических файлов в ответ на запросы CORS, используя технику, описанную в этом вопросе . Однако, когда файл не существует, ответ 404 не содержит Access-Control-Allow-Origin: *заголовок и блокируется браузером.

Как отправить Access-Control-Allow-Origin: *404 ответа?

Ответы:


35

Несмотря на то, что об этом давно уже спрашивали, я компилировал nginx с большим количеством модулей, но с более новой версией nginx я обнаружил, что мне не нужно специально компилировать nginx, все, что мне нужно было добавить alwaysдирективу.

http://nginx.org/en/docs/http/ngx_http_headers_module.html

Syntax: add_header name value [always];

Если указан параметр Always (1.7.5), поле заголовка будет добавлено независимо от кода ответа.

Итак, настроенная версия заголовков CORS :

            if ($cors = "trueget") {
                    # Tells the browser this origin may make cross-origin requests
                    # (Here, we echo the requesting origin, which matched the whitelist.)
                    add_header 'Access-Control-Allow-Origin' "$http_origin" always;

                    # Tells the browser it may show the response, when XmlHttpRequest.withCredentials=true.
                    add_header 'Access-Control-Allow-Credentials' 'true' always;
            }

2
alwaysбыл ключ. Спасибо, что указали мне на это, я схожу с ума!
Бонди

11

Я предполагаю, что вы в настоящее время используете add_headerдирективу. В документации отмечается, что для заголовка устанавливается только код состояния 200, 204, 301, 302 и 304. Чтобы установить заголовок для 404 кодов состояния, вам нужно использовать more_set_headersдирективу из модуля headers_more (вам может потребоваться перекомпилировать nginx, чтобы получить этот модуль). Следующее установит заголовок для всех кодов состояния:

more_set_headers 'Access-Control-Allow-Origin: *';

Вы также можете ограничить его определенными кодами статуса:

more_set_headers -s '404' 'Access-Control-Allow-Origin: *';
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.