django cors标头和nginx配置:飞行前响应缺少cors标头

django cors标头和nginx配置:飞行前响应缺少cors标头,nginx,amazon-ec2,cors,django-cors-headers,Nginx,Amazon Ec2,Cors,Django Cors Headers,我使用django cors headers 3.1.1来处理django后端和Javascript前端应用程序之间的请求和响应。传输是不安全的(即http,而不是https) 在本地托管时,一切正常。但是在服务器上部署之后,我不再看到CORS头 以下是正在开发的标题: 在生产中: 错误消息: Access to XMLHttpRequest at 'http://[HOST_IP]/api/assets/' from origin 'http://my_custom_domain.eu' h

我使用django cors headers 3.1.1来处理django后端和Javascript前端应用程序之间的请求和响应。传输是不安全的(即http,而不是https)

在本地托管时,一切正常。但是在服务器上部署之后,我不再看到CORS头

以下是正在开发的标题: 在生产中:

错误消息:

Access to XMLHttpRequest at 'http://[HOST_IP]/api/assets/' from origin 'http://my_custom_domain.eu' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
我的nginx配置如下所示:

server {
    listen 80;
    server_name [HOST_IP];

    location / {
        include proxy_params;
        proxy_pass http://unix:/home/ubuntu/[path_to_app]/app.sock;

        add_header 'Access-Control-Allow-Origin' '*';
        add_header 'Access-Control-Allow-Methods' 'GET, PUT, OPTIONS';
        add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
        add_header 'Access-Control-Max-Age' 86400;

        if ($request_method = 'OPTIONS') {
            add_header 'Content-Type' 'text/html; charset=utf-8';
            add_header 'Content-Length' 0;
            return 204;
        }
        if ($request_method = 'PUT') {
            add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
        }
        if ($request_method = 'GET') {
            add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
        }
    }

    location /static/ {
        autoindex on;
        alias /home/ubuntu/[path_to_app]/site/static/;
    }
}
django cors收割台的设置现在在开发和生产中完全相同:

INSTALLED_APPS = (
    …
    "corsheaders",
    …
)
MIDDLEWARE = [
    …
    "corsheaders.middleware.CorsMiddleware",
    "django.middleware.common.CommonMiddleware",
    …
]
CORS_ORIGIN_ALLOW_ALL = True
CORS_ALLOW_METHODS = ['DELETE','GET','OPTIONS','PATCH','POST','PUT']
在客户端,我试图添加“Access-Control-Request-Method”:“PUT”头,但浏览器拒绝了。客户电话中没有什么不寻常的地方:

  axios({
    method: 'put',
    url: `${this.backendUrl}/api/assets/`,
    data: formData,
    headers: {
      'Content-Type': 'application/octet-stream',
    }
  })
另外,我第一次尝试在AmazonAWSEC2上托管,所以可能有一些我不知道的必需的AWS配置。例如,是否需要使用API网关启用CORS?没有这样说(“如果您使用的是API网关导入API,则可以使用OpenAPI文件设置CORS支持”)

前端应用程序托管在具有以下CORS策略的S3存储桶上:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>PUT</AllowedMethod>
    <AllowedMethod>POST</AllowedMethod>
    <AllowedMethod>GET</AllowedMethod>
    <MaxAgeSeconds>3000</MaxAgeSeconds>
    <AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>


,但在不太了解nginx的情况下,这注定会失败。

我通过改变三件事解决了这个问题:

自动气象站 我注意到各国:

CORS已经为AmazonEC2API启用,并且已经为您准备好了 使用。您不需要执行任何其他配置步骤 开始使用此功能。你的生活方式没有改变 调用AmazonEC2API;它们仍然必须用有效的签名 AWS凭据,以确保AWS可以对请求者进行身份验证。[……]

这通常由AWS SDK或CLI处理,但在我的例子中,我没有使用任何一个,因此我必须添加
AWS\u ACCESS\u KEY\u ID
AWS\u SECRET\u ACCESS\u KEY
。就我而言,我只是使用:

不过,我已经看过很多例子,说明如何在没有任何附加依赖项的情况下添加AWS签名v.4

NGINX 在nginx配置中,我将所有add_头语句放入条件代码块中。这个想法来自于

Django cors收割台 在这里,添加非默认标题就足够了

from corsheaders.defaults import default_headers
CORS_ALLOW_HEADERS = list(default_headers) + [
    'X-Amz-Date',
]

希望这能帮助别人

server {
    listen 80;
    server_name [HOST_IP];

    location / {
        include proxy_params;
        proxy_pass http://unix:/home/ubuntu/[path_to_app]/app.sock;


        if ($request_method = 'OPTIONS') {
            add_header 'Access-Control-Allow-Origin' '*';
            add_header 'Access-Control-Allow-Methods' 'GET, PUT, OPTIONS, POST, DELETE';
            add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization,X-Amz-Date';
            add_header 'Access-Control-Max-Age' 86400;
            add_header 'Content-Type' 'text/html; charset=utf-8';
            add_header 'Content-Length' 0;
            return 204;
        }
        if ($request_method = 'PUT') {
            add_header 'Access-Control-Allow-Methods' 'GET, PUT, OPTIONS, POST, DELETE';
            add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization,X-Amz-Date';
            add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
        }
        if ($request_method = 'GET') {
            add_header 'Access-Control-Allow-Origin' '*';
            add_header 'Access-Control-Allow-Methods' 'GET, PUT, OPTIONS, POST, DELETE';
            add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization,X-Amz-Date';
            add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
        }
    }

    location /static/ {
        autoindex on;
        alias /home/ubuntu/analizy/be/site/static/;
    }
}
from corsheaders.defaults import default_headers
CORS_ALLOW_HEADERS = list(default_headers) + [
    'X-Amz-Date',
]