摘要:场景我们的资源来自网络的四面八方,所以难免需要用上跨域,业界也有非常多跨域的解决方案,这次我是来说说跨域与状态码之间的一个问题。
场景
我们的资源来自网络的四面八方,所以难免需要用上跨域,业界也有非常多跨域的解决方案,这次我是来说说跨域与状态码之间的一个问题。
问题当我们的 URL 地址返回的状态码是 400、403、404、500 的时候,跨域的资源是不会跟随返回的,也就是说,即便是 Nginx 上配置了 add_header 关键字,也不会随着内容返回而返回。
举个例子说:
add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods *;
当我们在请求对应地址的时候,理应是会返回已经配置好的头部信息,但是我们来看看最终的结果。
200
HTTP/1.1 200 OK Server: openresty/1.11.2.2 Date: Fri, 26 Jan 2018 08:46:39 GMT Content-Type: text/html; charset=UTF-8 Content-Length: 558 Last-Modified: Tue, 28 Mar 2017 01:13:24 GMT Connection: keep-alive ETag: "58d9b8b4-22e" Access-Control-Allow-Origin: * Access-Control-Allow-Methods: * Accept-Ranges: bytes
内容无误。
404
HTTP/1.1 404 Not Found Server: openresty/1.11.2.2 Date: Fri, 26 Jan 2018 08:47:18 GMT Content-Type: text/html; charset=UTF-8 Content-Length: 175 Connection: keep-alive
神奇了,这里404状态码下面居然自定义的响应头消失了。
原因与解决方式留意 Nginx 文档上说的:
Adds the specified field to a response header provided that the response code equals 200, 201 (1.3.10), 204, 206, 301, 302, 303, 304, 307 (1.1.16, 1.0.13), or 308 (1.13.0). The value can contain variables.
意思就是说,add_header 只会追加到以上响应状态码的响应头上面。
因为咱们的 API 有各种的状态码返回,那么其他状态码下,该怎么办? 大家留意文档上有一个参数。
Syntax: add_trailer name value [**always**]; Default: — Context: http, server, location, if in location This directive appeared in version 1.13.2.
你会发现有个 [always] 参数,那么这个参数,就是让你的配置头,应用在所有的影响上面去。
将参数添加进去:
add_header Access-Control-Allow-Origin * always; add_header Access-Control-Allow-Methods * always;
重启 nginx 服务器后重试一下.
200
HTTP/1.1 200 OK Server: openresty/1.11.2.2 Date: Fri, 26 Jan 2018 09:01:36 GMT Content-Type: text/html; charset=UTF-8 Content-Length: 558 Last-Modified: Tue, 28 Mar 2017 01:13:24 GMT Connection: keep-alive ETag: "58d9b8b4-22e" Access-Control-Allow-Origin: * Access-Control-Allow-Methods: * Accept-Ranges: bytes
200请求没变化,一切正常。
404
HTTP/1.1 404 Not Found Server: openresty/1.11.2.2 Date: Fri, 26 Jan 2018 09:02:12 GMT Content-Type: text/html; charset=UTF-8 Content-Length: 175 Connection: keep-alive Access-Control-Allow-Origin: * Access-Control-Allow-Methods: *
现在 404 也正确了。我们的跨域也正是配置完成。
关于 OPTIONS 请求当我们前端发起跨域请求的时候,会事先发起一次 OPTIONS 请求,以用来查询该接口是否支持跨域和对应的请求方法。
在配置方面可以这么做。
if ($request_method = OPTIONS) { add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods *; add_header Access-Control-Allow-Credentials true; return 204; }
当然我这里的 * 这么用是不好的,你需要对应域名去配置。
另外PHP方面我们也提供了一个 CORS 的扩展库,可以直接在fastd中使用。
github: cors-provider
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/39779.html
摘要:最近写了一些关于前后端分离项目之后,跨域相关方案的基本原理和常见误区的帖子,主要包括和反向代理。反向代理此时后端相当于不跨域,和正常请求一致,无需额外配置。 最近写了一些关于前后端分离项目之后,跨域相关方案的基本原理和常见误区的帖子,主要包括CORS和Nginx反向代理。这两种方案项目中都有在用,各有优缺,关于具体使用哪种方案,大家的观点也不大一致,本文主要就此展开一下,从前后端及服务...
摘要:目前,所有浏览器都支持该功能,浏览器不能低于。因此,实现通信的关键是服务器。如果指定的域名在许可范围内,服务器返回的响应,会多出头信息字段也可能多出其他可选字段或者是表示接受任意域名的请求。 实际跨域问题及其解决方案 1.课题:ajax实现跨域访问 2.背景: 1.画面服务器:192.168.196.6 → tomcat服务2.js模板服务器:192.168.196.8 → ngi...
阅读 688·2021-11-22 09:34
阅读 3824·2021-09-22 15:42
阅读 1331·2021-09-03 10:28
阅读 1074·2021-08-26 14:13
阅读 1902·2019-08-29 15:41
阅读 1429·2019-08-29 14:12
阅读 3365·2019-08-26 18:36
阅读 3310·2019-08-26 13:47