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 上被阻止?

CB_SELECTSTRING 在某些机器上被忽略

Cors 策略阻止 JSON 请求

从 Angular App 到 Django REST API 的 API 请求 - 被 CORS 阻止

CORS 正在阻止 PUT、DELETE 和 POST 请求,但 GET 正在工作