CORS 在某些目录上被阻止,但在其他目录上没有
Posted
技术标签:
【中文标题】CORS 在某些目录上被阻止,但在其他目录上没有【英文标题】:CORS blocked on some directories, but not others 【发布时间】:2020-06-09 13:12:56 【问题描述】:一周前,我遇到了 CORS 错误:
Access to XMLHttpRequest at [domainA/example/directory/file.xml] from origin [domainB] has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
我通过编辑 .htaccess 解决了这个问题,添加:
<IfModule mod_headers.c>
<FilesMatch ".+">
Header set Access-Control-Allow-Origin "*"
</FilesMatch>
</IfModule>
这行得通!但是,我现在在不同路径(即“domainA/不同/example/directory/file.json”)请求同一域中的数据时遇到了同样的问题。
难道我不能根据我对 .htaccess 所做的编辑请求任何目录中的任何文件吗? (位于“/.../.../www/[domainA-root]/.htaccess”)
值得注意的是,在我的第一个示例中,[domainA/example/directory/file.xml] 是 Drupal 创建的 XML 视图,而不是实际目录中的静态文件。
【问题讨论】:
对于不同路径的文件的请求,响应的HTTP状态码是什么?您可以使用浏览器开发工具中的网络窗格进行检查。是 4xx 还是 5xx 错误而不是 200 OK 成功响应? 无状态码返回。只是在状态栏中说“(失败)”。 对于不同路径的文件的请求,如果您尝试直接在浏览器中打开该文件的 URL,会发生什么情况? 它将 JSON 显示为纯文本,就像您在浏览器中打开任何 javascript 或 JSON 文件一样。 您能否从浏览器控制台窗格(在 Web 调试器中)发布确切的错误消息?可能您正在发送一个不允许的标头。 【参考方案1】:这看起来像是您的浏览器将先前 OPTIONS 请求的响应缓存到先前请求的特定 URL 的典型情况,标头之前不存在并且浏览器不会费心再次检查,直到 TTL 过期。
我会说:检查它的标题是否从您的命令行发出详细的 curl 请求,即
curl -v https://yourhost/yourURL
然后你可以从那里拿走它
【讨论】:
【参考方案2】:而不是在文件匹配中尝试 .+,您应该尝试:
<FilesMatch "\.(htm|html|css|js|php|json)$">
AddDefaultCharset UTF-8
DefaultLanguage en-US
Header set Access-Control-Allow-Origin "*"
Header set Access-Control-Allow-Methods "*"
</FilesMatch>
【讨论】:
以上是关于CORS 在某些目录上被阻止,但在其他目录上没有的主要内容,如果未能解决你的问题,请参考以下文章
请求在 WAMP 上被阻止,但在 XAMPP 上允许 CORS
请求在 https 上工作,但由于 cors 而在 http 上被阻止?