在Safari 10.1上尝试CORS请求时,在包含查询参数的网址(例如https://example.com/api?v=1)上,Safari说
由于访问控制检查而无法加载XMLHttpRequest
Chrome / Firefox工作正常。
对于没有"?v = 1"的页面请求,Safari也可以正常工作。
我尝试从
更改服务器响应标头Access-Control-Allow-Origin:https://example.com
到
Access-Control-Allow-Origin:https://example.com/api?v=1
但这会破坏Chrome。
有什么建议吗?
答案 0 :(得分:2)
尝试以下方法可能会有效 -
Access-Control-Allow-Origin: <origin> | *
答案 1 :(得分:1)
您正在遇到CORS问题。
一些可能的原因:
Access-Control-Allow-Origin
只能在服务器端设置,而不能在客户端脚本中设置。 (你没有说清楚你是否正确地做到了。)http
vs https
vs甚至file
)是完全相同的吗? "^http(s)?://(.+\.)?test\.com$
的设置来设置配置(例如Apache)
。^
标记行的开头以防止此URL之前的任何内容。你需要一个协议并允许这两个。子域是可选的。并且$
标记了行尾(您不需要设置子页面,因为原点仅基于主机)。Access-Control-Allow-Headers: Origin
添加到服务器配置中也可能是一种解决方案。尝试将我的Safari的实际请求与Firefox或Chrome完成的成功请求进行比较,以便发现可能丢失的Headers(也可以将它们与您的服务器配置进行比较)。答案 2 :(得分:0)
问题是因为有必要在cors的数据中更具体地说明这一点,而在其他能够解释它的操作系统中则不会发生
这个人对我来说很适合php
header ("Access-Control-Allow-Headers: X-API-KEY, Origin, X-Requested-With, Content-Type, Accept, Access-Control-Request-Method");
header ("Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE");
header ("Allow: GET, POST, OPTIONS, PUT, DELETE");
$ method = $ _SERVER ['REQUEST_METHOD'];
if ($ method == "OPTIONS") {
die ();
}
答案 3 :(得分:0)
您的服务器需要回复OPTIONS http方法。不仅是GET / POST / PUT / DELETE。 Safari默默地要求将其隐藏在后台。您可以通过连接上的MITM攻击来发现此问题,例如Fiddler。
OPTIONS请求至少需要使用跨域资源共享(CORS)标头进行响应,例如:
此外:Web应用程序防火墙(WAF)或应用程序安全管理器(ASM)需要允许OPTIONS请求传递到您的服务器。通常,默认情况下会阻止此操作,因为它会提供一些有关您的API使用的攻击面变量(http方法和标头)的信息。
答案 4 :(得分:-1)
如果有人遇到此错误,则该错误仅发生在我正在构建的应用程序中。以我为例,它在uri中是尾随/,引起了301响应,出于某种原因,Safari将其解释为500响应。
答案 5 :(得分:-1)
您应该检查调用的方法类型-PUT,POST,GET等。