RESTful API 设计 – OPTIONS

很常见的跨域问题,不常见的 OPTIONS 请求。


对于经常遇到的跨域访问的问题,只需要在Nginx配置文件里加入以下配置,即可开启跨域。

add_header Access-Control-Allow-Origin *;

* 表示任何域名都可以访问,如果要在生产环境使用,建议换成具体的域名,比如 Access-Control-Allow-Origin: http://domain.com。

但是对于一些不安全的请求,比如 PUT,DELETE 请求,或者 Content-Type: application/json 的 POST 请求,浏览器必须首先使用 OPTIONS 方法发起一个预检请求(preflight request),从而获知服务端是否允许该跨域请求。服务器确认允许之后,才发起实际的 HTTP 请求。

由于在设计 RESTful API 的时候并没有考虑到 OPTIONS 请求的情况,所以只能在 Nginx 中对 OPTIONS 请求进行统一配置。

if ($request_method = 'OPTIONS') { 
	add_header Access-Control-Allow-Origin *; 
	add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;
	add_header Access-Control-Allow-Headers Content-Type;
	return 204; 
}

最终的 Nginx 配置是这样的。

add_header Access-Control-Allow-Origin *;

location / {
    if ($request_method = 'OPTIONS') { 
	add_header Access-Control-Allow-Origin *; 
	add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;
	add_header Access-Control-Allow-Headers Content-Type;
	return 204; 
    }

    try_files $uri $uri/ /index.php$is_args$args;
}

参考:

https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS

https://tools.ietf.org/html/rfc7231#section-4.3.7

 471 total views,  2 views today

Leave a Reply

Your email address will not be published. Required fields are marked *