跨域资源共享(CORS)是一种基于 HTTP 标头的机制,允许服务器指示任何来源(域名、方案或端口),除了自身之外,从中
浏览器应允许加载资源。
简而言之——
web 服务器告诉您(浏览器)应该信任哪些网站以使用
该站点。
- Scammysite.bad 尝试告诉您的浏览器向 good-api-site.good 发送请求
- good-api-site.good 告诉您的浏览器,它只应信任 other-good-site.good
- 您的浏览器说,您真的不应信任 scammysite.bad 对 good-api-site.good 的请求,于是CORS 拯救了您。
来自
跨域资源共享(CORS)
如果您正在创建一个站点,并且您真的不关心谁与您进行集成。那就继续吧。在您的ACL中设置
*
。
然而,如果您正在创建一个站点,并且只允许站点X,甚至是站点X、Y和Z进行集成,您可以使用CORS来指示客户端浏览器只信任这些站点与
您的站点进行集成。
浏览器当然可以选择忽略这一点。再次强调,CORS保护的是您的客户端,而不是您自己。
CORS允许定义
*
或
一个站点。这可能会限制您,但您可以通过向Web服务器添加一些动态配置来解决这个问题 -
并且帮助您更具体地设置。
以下是在Apache中如何针对每个站点配置CORS的示例:
# Save the entire "Origin" header in Apache environment variable "AccessControlAllowOrigin"
# Expand the regex to match your desired "good" sites / sites you trust
SetEnvIfNoCase Origin "^https://(other-good-site\.good|one-more-good.site)$" AccessControlAllowOrigin=$0
# Assuming you server multiple sites, ensure you apply only to this specific site
<If "%{HTTP_HOST} == 'good-api-site.com'">
# Remove headers to ensure that they are explicitly set
Header unset Access-Control-Allow-Origin env=AccessControlAllowOrigin
Header unset Access-Control-Allow-Methods env=AccessControlAllowOrigin
Header unset Access-Control-Allow-Headers env=AccessControlAllowOrigin
Header unset Access-Control-Expose-Headers env=AccessControlAllowOrigin
# Add headers "always" to ensure that they are explicitly set
# The value of the "Access-Control-Allow-Origin" header will be the contents saved in the "AccessControlAllowOrigin" environment variable
Header always set Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin
# Adapt the below to your use case
Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS, PUT" env=AccessControlAllowOrigin
Header always set Access-Control-Allow-Headers "X-Requested-With,Authorization" env=AccessControlAllowOrigin
Header always set Access-Control-Expose-Headers "X-Requested-With,Authorization" env=AccessControlAllowOrigin
</If>