Cho phép các yêu cầu nguồn gốc chéo (CORS) trên Nginx cho các phản hồi 404


26

Tôi đang sử dụng Nginx để phục vụ các tệp tĩnh để đáp ứng các yêu cầu CORS sử dụng kỹ thuật được nêu trong câu hỏi này . Tuy nhiên, khi tệp không tồn tại, phản hồi 404 không chứa Access-Control-Allow-Origin: *tiêu đề và trình duyệt cũng bị chặn.

Làm cách nào tôi có thể gửi Access-Control-Allow-Origin: *phản hồi 404?

Câu trả lời:


35

Mặc dù điều này đã được hỏi từ lâu, tôi đã biên dịch nginx với nhiều mô-đun hơn, nhưng với phiên bản nginx mới hơn, tôi thấy tôi không phải biên dịch nginx tùy chỉnh, tất cả những gì tôi cần là thêm alwayschỉ thị.

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

Syntax: add_header name value [always];

Nếu tham số luôn được chỉ định (1.7.5), trường tiêu đề sẽ được thêm bất kể mã phản hồi.

Vì vậy, một phiên bản điều chỉnh của tiêu đề 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
alwayslà chìa khóa Cảm ơn bạn đã chỉ cho tôi điều này, tôi đã phát điên!
bgondy

11

Tôi cho rằng bạn hiện đang sử dụng add_headerchỉ thị. Tài liệu lưu ý rằng điều này chỉ đặt tiêu đề cho mã trạng thái 200, 204, 301, 302 và 304. Để đặt tiêu đề cho mã trạng thái 404, bạn sẽ cần sử dụng lệnh more_set_headerstừ mô-đun headftimemore (bạn có thể cần phải biên dịch lại nginx để có được mô-đun này). Sau đây sẽ đặt tiêu đề cho tất cả các mã trạng thái:

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

Bạn cũng có thể giới hạn nó ở các mã trạng thái cụ thể:

more_set_headers -s '404' 'Access-Control-Allow-Origin: *';
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.