问题描述
几天以来,有时我的浏览器中出现错误消息
Access to XMLHttpRequest at 'https://websiteB.com/file.zlip' from origin 'https://websiteA.com' has been blocked by CORS policy: The 'Access-Control-Allow-Origin' header has a value 'http://192.168.0.200' that is not equal to the supplied origin.
据我了解,通常,SOP(相同来源政策)是有效的,并且可以通过CORS绕开所有参与者的方式。这只涉及XHR之类的动态服务器请求。
我的目的是在网站A中使用来自网站B的数据。因此,我在websiteB的根目录中保存了一个.htacces。
RewriteEngine on
RewriteBase /
# allow request from multiple domains (domain1.com|domain2.com|...)
<IfModule mod_headers.c>
SetEnvIf Origin "http(s)?://(www\.)?(websiteA.com)$" AccessControlAllowOrigin=$0
Header add Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin
</IfModule>
问题在于此错误仅在某些时候发生。在测试之前,我总是从浏览器中完全清除缓存。
Mozilla Firefox的结果:
响应头
HTTP/2 200 OK
date: Mon,31 Aug 2020 12:31:55 GMT
server: Apache
etag: "1d1cf8-58ffd72bc6380"
last-modified: Tue,13 Aug 2019 10:53:18 GMT
content-length: 1907960
access-control-allow-origin: http://192.168.0.200
age: 698
accept-ranges: bytes
strict-transport-security: max-age=15768000
X-Firefox-Spdy: h2
请求标头
GET /file.zlip HTTP/2
Host: websiteB.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0
Accept: */*
Accept-Language: de,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate,br
Origin: https://websiteA.com
Connection: keep-alive
Referer: https://websiteA.com/
TE: Trailers
据我所知,access-control-allow-origin应该是websiteA.com,我的本地网络中怎么可能有我的IP地址?有没有一种方法可以在发送前清除标题?
更新: 我只是发现,如果在浏览调试模式下取消选择启用“ http缓存”,它将正常工作。所以我插入了我的网站
<Meta http-equiv="Cache-Control" content="no-cache,no-store,must-revalidate" />
<Meta http-equiv="Pragma" content="no-cache" />
<Meta http-equiv="Expires" content="0" />
和我的.htaccess
<IfModule mod_headers.c>
Header set Cache-Control "no-cache,must-revalidate"
Header set Pragma "no-cache"
Header set Expires 0
</IfModule>
但没有任何帮助。有谁知道这是怎么回事?
解决方法
这是因为您的CORS标头与原点不匹配。
从您的响应标题中:
access-control-allow-origin: http://192.168.0.200
从您的请求标头中:
Origin: https://websiteA.com
由于http://192.168.0.200
不是https://websiteA.com
,因此违反了CORS,浏览器正确地阻止了该请求。响应的正确CORS标头应为:
access-control-allow-origin: https://websiteA.com