【问题标题】:Why is this simple CORS GET failing?为什么这个简单的 CORS GET 失败了?
【发布时间】:2016-09-23 00:10:05
【问题描述】:

我有一个运行 apache 的服务器。 .htaccess 包含以下内容:

<IfModule mod_headers.c>
  <FilesMatch "\.(eot|ttf|otf|woff|css)$">
    Header add Access-Control-Allow-Origin "*"
  </FilesMatch>
</IfModule>

为什么会这样

$.get('https://www.sarahlawrence.edu/_assets/v6/fonts/otama-text-regular/otamatextregular.eot')`

有效(在任何域的控制台中尝试),而

$.get('https://www.sarahlawrence.edu/_assets/v6/lib/icons.data.svg.css')

失败并出现此错误:

XMLHttpRequest 无法加载 https://www.sarahlawrence.edu/_assets/v6/lib/icons.data.svg.css。请求的资源上不存在“Access-Control-Allow-Origin”标头。 Origin 'https://whatever.com' 因此不允许访问。

我怎样才能让它工作?

【问题讨论】:

  • 嗯,第二个没有返回 Access-Control-Allow-Origin,如错误消息所述。您确定 .htaccess 正确/工作正常吗?
  • @user2415266 是的,我相信 htaccess 工作正常,因为站点的其余部分按预期工作。第二个给你带来了什么?上面的错误消息来自 Chrome。 Firefox 给出“跨域请求被阻止:同源策略不允许读取位于sarahlawrence.edu/_assets/v6/lib/icons.data.svg.css 的远程资源。(原因:CORS 标头“Access-Control-Allow-Origin”缺失)。”
  • 我很确定问题出在 FilesMatch 规则中的正则表达式,因为您的 css 文件被称为“icons.data.svg.css”,它不会被找到为“.css”跨度>
  • 如果我正确读取正则表达式,它只会匹配以允许的扩展名结尾的字符串,因此前面的 icons.data.svg 不会是匹配的集市.. 只有最后的 .css 。 . 所以这对我来说看起来不错。

标签: javascript ajax .htaccess cors


【解决方案1】:

可以使用 curl 确认缺少的 Header:

 curl -v https://www.sarahlawrence.edu/_assets/v6/fonts/otama-text-regular/otamatextregular.eot > delme.txt

 curl -v https://www.sarahlawrence.edu/_assets/v6/lib/icons.data.svg.css > delme.txt

正则表达式应该对文件名感到满意,所以我认为问题是因为 apache 配置中的某处存在冲突配置。 另一项诊断检查是将失败的文件复制到字体目录并检查标题是否存在 - 这将确认正则表达式或文件名不是问题,但表明它与目录配置相关。

您已声明文档根目录或子目录中没有其他 .htaccess 文件(这可能会导致问题),并且该文件仅在没有标题的情况下提供。

我在这个阶段的感觉是,这可能与你的 mod_pagespeed 有关,它对 lib/icons 禁用。它甚至可以归结为加载模块的顺序。

为了以防万一,我会先重新启动你的 apache。应禁用其间的任何缓存或代理基础设施。接下来我将禁用 mod_pagespeed 并查看问题是否仍然存在。

我还会检查您的 httpd.conf 或虚拟主机配置中是否有类似的配置块,因为这可能会捕获一些目录而不是其他目录,并且您的 .htaccess 不是做预期的事情。作为进一步检查,我将尝试删除或临时重命名 .htaccess(更改为 htaccess-removed 或类似名称)以确认不再包含 URL 请求标头,使用 curl 或其他方法验证 CORS 标头。

可能不相关,但我要检查的另一件事是文件和目录的权限和所有权 - 值得一提以防万一。

还值得检查有关重新启动 apache 和发出请求的错误日志,因为这可能会提供进一步的信息。

【讨论】:

  • 确实是 mod_pagespeed 导致了这个问题。一旦我将ModPagespeedDisallow "*/lib/icon*" 添加到我的 .htaccess 中,它就开始工作了。谢谢!
【解决方案2】:

.htaccess 文件的完整路径是什么?

您的.htaccess 文件未设置为将其规则应用于https://www.sarahlawrence.edu/_assets/v6/lib/ 位置中的文件,或者在其他地方有另一个规则取代了您上面显示的规则。

【讨论】:

  • .htaccess 文件位于服务器的根目录下,即 /.htaccess。 /lib/ 或 /fonts/ 文件夹中没有其他 .htaccess 文件(或那些的祖先文件夹,除了服务器根目录中的文件夹),并且除了 mod_pagespeed 是 .htaccess 中没有其他对任一文件夹的引用lib/icons 禁用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多