尽管配置了正确的CORS标头,但仍出现“跨域请求被阻止”的301响应

时间:2020-03-28 14:58:08

标签: javascript xmlhttprequest cors http-status-code-301

我正在使用其公共API访问NASA图片,但出现此错误:

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at
[nasa api website] (Reason: CORS header ‘Access-Control-Allow-Origin’ missing).

但是,当我检查他们的响应标头时,会显示“ Access-Control-Allow-Origin”并将其设置为“ *”,在这里您可以看到它:

响应标题:

Access-Control-Allow-Origin *
Age 0
Cache-Control   max-age=0, private, must-revalidate
Content-Encoding    gzip
Content-Type    application/json; charset=utf-8
Date    Sat, 28 Mar 2020 14:37:13 GMT
Etag    W/"e26hidden..."
Referrer-Policy strict-origin-when-cross-origin
Server  openresty
Strict-Transport-Security   max-age=31536000; includeSubDomains
Vary    Origin
Via https/1.1 api-umbrella (ApacheTrafficServer [cMsSf ]), 1.1 vegur
X-Cache MISS
X-Content-Type-Options  nosniff
X-Download-Options  noopen
X-Frame-Options SAMEORIGIN
X-Permitted-Cross-Domain-Policies   none
X-RateLimit-Limit   1000
X-RateLimit-Remaining   999
X-Request-Id    00c8c415-37ad-474b-bfbd-8e968d60f37f
X-Runtime   0.125778
X-Xss-Protection    1; mode=block

请求标头:

Accept  text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding gzip, deflate, br
Accept-Language en-US,en;q=0.5
Connection  keep-alive
Host    api.nasa.gov
If-None-Match   W/"e26chidden.."
Upgrade-Insecure-Requests   1
User-Agent  Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:74.0) Gecko/999991 Firefox/74.0

1 个答案:

答案 0 :(得分:1)

在代码中为跨域请求指定URL时,可能会发生一个常见错误,该错误可能导致浏览器最终报告CORS错误,而实际上该问题只是一个易于忽略的错误在请求网址本身中。

错误只是缺失的"s":使用"http"作为URL协议的一部分而不是"https"

缺少的"s"导致您发送请求的服务器以3xx重定向响应到该URL的等效https位置-但问题是:默认情况下,许多服务器在3xx响应中不会包含Access-Control-Allow-Origin标头。因此,浏览器获得了3xx,但是由于缺少Access-Control-Allow-Origin标头,因此浏览器拒绝让您的代码遵循重定向;而是浏览器就在那里停止并发出CORS错误。

因此,当遇到类似情况时,解决问题的方法是:在devtools中打开“网络”窗格并检查响应。检查此处显示的响应状态代码,并检查响应标题。如果原因是此答案中描述的错误,您将看到一个Location响应标题。该值是服务器尝试将请求重定向到的URL。

当您查看Location值时,最初可能会认为它与代码中的请求URL完全相同-因为很容易忽略,区别仅在于缺少单个{{1 }}。但是,当然,如果您使用该"s"值中的URL,并用它替换前端代码中的请求URL,并且该URL有效,那么区别就显而易见了。

因此,对于此问题中的URL,问题仅在于前端代码指定了Location URL,而应该是http://mars.jpl.nasa.gov URL。