nginx配置跨域--OPTIONS

今天在看一个跨域问题,主请求是一个PATCH请求,该请求并没有携带origin,然后直接报跨域。因此它也不会走到nginx配置的以下逻辑:

        if ($http_origin ~* (zz.com)) {
            add_header 'Access-Control-Allow-Origin' '$http_origin' always;
            add_header 'Access-Control-Allow-Credentials' 'true';
            add_header 'Access-Control-Allow-Methods' '*';
            add_header 'Access-Control-Allow-Headers' '$http_access_control_request_headers' always;
            add_header 'Access-Control-Expose-Headers' '*' always;
	    }

然后它下面紧跟着一个OPTIONS请求,请求是没问题的,它是由如下分支返回的:

      if ($request_method = 'OPTIONS') {
          add_header 'Access-Control-Allow-Origin' '*' always;
          add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS,PUT,DELETE' always;
          add_header 'Access-Control-Allow-Headers' '*' always;
          add_header 'Access-Control-Max-Age' 1728000 always;
          add_header 'Content-Length' 0;
          add_header 'Content-Type' 'text/plain; charset=utf-8';
          return 204;
        }

这个是以前前端同学配的,而且已经跑路,导致我其实有些困惑,因此研究了一下这个OPTIONS请求。

在跨域请求中,当发送 `PATCH` 请求时,浏览器会先发送一个 `OPTIONS` 请求进行预检。这是根据跨域资源共享(CORS)规范定义的行为。 预检请求的目的是为了检查服务器是否允许实际请求的跨域访问。在预检请求中,浏览器会发送一个 `OPTIONS` 请求,并携带一些跨域相关的头字段,如 `Origin`、`Access-Control-Request-Method`、`Access-Control-Request-Headers` 等。 服务器在接收到预检请求后,会根据请求头中的信息进行验证,并返回相应的响应头。如果服务器允许实际请求的跨域访问,它会在响应头中包含 `Access-Control-Allow-Origin`、`Access-Control-Allow-Methods`、`Access-Control-Allow-Headers` 等字段。 只有在服务器返回的预检请求的响应头中包含了 `Access-Control-Allow-Origin` 字段,并且允许请求的方法和头字段,浏览器才会继续发送实际的 `PATCH` 请求。 因此,当你在发送 `PATCH` 请求时,如果服务器没有正确配置跨域访问的相关响应头,浏览器会先发送一个 `OPTIONS` 请求进行预检,然后根据预检请求的响应头来决定是否继续发送实际的 `PATCH` 请求。 需要注意的是,预检请求和实际请求是两个独立的请求,它们之间可能存在一定的时间间隔。这也是为什么在某些情况下,`OPTIONS` 请求会在 `PATCH` 请求之前的原因。

因此怀疑是预检查返回的信息有问题,而且其他的GET之类的请求就毫无问题,因此把Access-Control-Allow-Methods中加上PATCH:

add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS,PUT,DELETE,PATCH' always;

恢复正常

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Nginx配置access-control-allow-origin是为了解决跨域访问的问题。 首先,需要在Nginx配置文件中添加以下代码: ```nginx location / { add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS'; add_header Access-Control-Allow-Headers 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range'; if ($request_method = 'OPTIONS') { add_header Access-Control-Max-Age 1728000; add_header Content-Type text/plain; add_header Content-Length 0; return 204; } } ``` 上述配置代码中,Access-Control-Allow-Origin设置为*,表示允许所有源进行访问。如果希望只允许特定的域名访问,可以将*更改为相应的域名。 Access-Control-Allow-Methods用于设置支持的请求方法,如GET、POST和OPTIONS等。 Access-Control-Allow-Headers设置支持的请求头,如DNT、Content-Type等。 如果请求方法是OPTIONS,表示发送的是预检请求(preflight request),那么需要在返回头中加入Access-Control-Max-Age、Content-Type和Content-Length等相关信息,并返回状态码204。 以上配置代码应该添加到需要解决跨域问题的站点的Nginx配置文件中,完成后重新加载Nginx配置即可生效。 通过上述配置,实现了在Nginx配置access-control-allow-origin,解决了跨域访问的问题。通过设置允许的域名、请求方法和请求头,可以确保安全且合法的跨域访问。 ### 回答2: access-control-allow-origin是一种跨域资源共享(CORS)机制,在nginx配置该功能可以允许指定的域名访问服务器资源。 要配置access-control-allow-origin,首先需要编辑nginx配置文件。通常,该文件位于/etc/nginx/nginx.conf。 在配置文件中找到相应的location块,该块用于指定需要配置access-control-allow-origin的路径。在该location块中,可以添加以下配置项来配置access-control-allow-origin: 1. 添加add_header设置access-control-allow-origin值为指定的域名。例如,可以使用以下配置项: ``` location /api { add_header Access-Control-Allow-Origin example.com; } ``` 这样配置后,只有来自example.com域名的请求才能访问/api路径下的资源。 2. 如果希望允许任意域名访问,可以使用通配符*作为access-control-allow-origin的值: ``` location /api { add_header Access-Control-Allow-Origin *; } ``` 这样配置后,所有域名的请求都可以访问/api路径下的资源。 3. 可以使用变量来动态设置access-control-allow-origin的值。例如,可以使用$http_origin变量来获取请求中的Origin头,并将其作为access-control-allow-origin的值: ``` location /api { add_header Access-Control-Allow-Origin $http_origin; } ``` 这样配置后,将会允许请求中的Origin头所指定的域名访问/api路径下的资源。 配置完成后,需要重新加载nginx配置文件,使配置生效。可以使用命令sudo service nginx reload或sudo systemctl reload nginx来重新加载配置文件。 通过以上配置nginx可以实现access-control-allow-origin的功能,从而允许指定的域名跨域访问服务器资源。 ### 回答3: access-control-allow-origin是一个用于跨域资源共享(CORS)的HTTP响应头部字段,用于指示服务器允许哪些域名的网页可以访问当前网站的资源。 在nginx配置access-control-allow-origin的方法如下: 1. 打开nginx配置文件,一般路径是/etc/nginx/nginx.conf。 2. 在http块下添加以下代码: ```nginx http { ... server { ... location / { # 允许指定域名跨域访问 add_header Access-Control-Allow-Origin http://example.com; # 或者允许所有域名跨域访问 add_header Access-Control-Allow-Origin *; ... } ... } ... } ``` 这里的http://example.com是一个示例域名,可以根据实际需求修改为需要允许跨域访问的域名。 3. 保存配置文件并重新启动nginx服务。 配置完成后,服务器将在响应头中添加Access-Control-Allow-Origin字段,并根据配置的域名来限制跨域访问。如果配置了具体的域名,只有来自该域名的请求才能成功访问当前网站的资源;如果配置了通配符`*`,则任何域名都可以访问当前网站的资源。 值得注意的是,配置access-control-allow-origin只是服务器端的配置,在服务端返回响应时决定是否允许跨域访问,而不是由客户端控制。这样可以有效地保护服务器的安全性,防止恶意网站滥用跨域资源。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值