我正在服务器内实现 CORS 协议,遵循CORS 标准。我的问题是当服务器希望拒绝特定来源时应如何响应。
我了解在允许来源时如何响应简单的预检请求。但是对于那些服务器不允许的 Origin 如何响应呢?我最初的猜测只是不返回任何 CORS 标头,这会导致预检请求失败(如所需)。
该标准在第 3.2.3 节中简要提到了这一点,但听起来它描述的是根本不希望参与 CORS 的服务器(与想要参与 CORS 并允许某些来源但不允许其他来源的服务器相反) ):
如果服务器不希望参与 CORS 协议,则其对 CORS 或 CORS 预检请求的 HTTP 响应不得包含任何上述标头。鼓励服务器在此类 HTTP 响应中使用 403 状态。
这是响应服务器不允许的来源的正确方法吗?客户端似乎可能会误解为“该服务器不允许任何跨源请求”(实际上,问题出在这个特定的源上,并且服务器将允许其他源)。
我知道这个问题,但它指的是规范的过时版本,答案似乎并不明确。
CORS 默认情况下处于禁用状态,因此如果您不希望给定主机获取响应,请勿将它们添加到服务器返回的 CORS Access-Control-Allow-Origin 标头中
访问控制允许来源:https: //www.example.com
如果主机向您的服务器发出请求,但它们未在此标头中列出,则它们将收到有关其预检请求的错误响应。
使用 CORS 的 nginx 配置示例如下所示
server {
listen 80;
server_name api.example.com;
location / {
# Simple requests
if ($request_method ~* "(GET|POST)") {
add_header "Access-Control-Allow-Origin" "https://example.com";
}
# Preflighted requests
if ($request_method = OPTIONS) {
add_header "Access-Control-Allow-Origin" "https://example.com";
add_header "Access-Control-Allow-Methods" "GET, POST, OPTIONS, HEAD";
add_header "Access-Control-Allow-Headers" "Authorization, Origin, X-Requested-With, Content-Type, Accept";
return 200;
}
# Handle request
}
}
Run Code Online (Sandbox Code Playgroud)
另外,规范中关于预检请求错误的重要说明:
CORS 失败会导致错误,但出于安全原因,JavaScript 代码无法获取有关错误原因的详细信息。所有代码都知道发生了错误。确定具体问题的唯一方法是查看浏览器的控制台以获取详细信息。
https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS
| 归档时间: |
|
| 查看次数: |
1115 次 |
| 最近记录: |