子域名之间设置CORS头时,Access-Control-Allow-Origin该怎么写才不会报错?
我在开发主站example.com时,子域名api.example.com返回的JSON数据总被浏览器拦截,控制台提示:
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://api.example.com/data. (Reason: CORS header 'Access-Control-Allow-Origin' missing).
之前试过在Nginx里这样配置:
server {
listen 80;
server_name api.example.com;
add_header Access-Control-Allow-Origin "*.example.com";
# 其他配置...
}
但依然不行。后来改成具体域名https://example.com后,控制台又报错说:
Refused to execute script from 'https://api.example.com/data' because its MIME type ('application/json') is not executable, and strict MIME type checking is enabled.
难道子域名之间只能通过通配符配置?但老师说通配符不安全…现在完全不知道该怎么调整CORS头了。
首先说下Access-Control-Allow-Origin这个头的设置。对于子域名之间共享资源的情况,直接使用通配符不是个好主意,虽然能解决问题但确实有安全隐患。不过你用.example.com这种写法是不对的,浏览器不会识别这样的通配符格式。
一个可行的方案是动态设置这个头。如果api.example.com只给固定的几个子域名提供服务,可以直接列出这些域名,用逗号分隔,比如:
add_header Access-Control-Allow-Origin "https://example.com, https://admin.example.com";要是你的服务需要支持更多子域名,可以用nginx变量来动态处理。下面是个示例代码:
这样就只对符合example.com格式的域名返回相应的CORS头,比通配符安全得多。
至于你说的MIME类型问题,那个报错是因为页面试图用