当前位置: 首页 > 知识库问答 >
问题:

我可以将Access-Control-Allow-Origin标头设置为域及其子域上的所有页面吗?

郤仰岳
2023-03-14

我正在尝试使用一种合法允许使用但不允许分发的网络字体。我在一个单独的用于静态内容的域中托管字体文件。这两个域不相关(一个不是另一个的子域)。假设使用webfont的站点是示例。com和托管它的站点就是一个例子。net。

我试过这个。示例上的htaccess文件。net

<FilesMatch "\.(ttf|otf|eot|woff|svg)$">
  <IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "example.com"
  </IfModule>
</FilesMatch>

然而,这使得字体只能在示例的主页上使用。com。我再次尝试:

    Header set Access-Control-Allow-Origin "example.com/*"

现在,该字体适用于示例。除了主页(当然)不是我想要的。

我找不到这个标题的任何留档。我真正想要的是允许example.comwww.example.com(或者,为了更好的衡量,*.example.com)上的所有页面。有没有简单的方法做到这一点?我猜标题需要某种正则表达式。

寻找我找到的文件,

  • 关于这个标题如何与ajax交互的很多信息,
  • 很多简短的注释都说这对于webfonts(至少在Firefox中)是必要的

我没有找到任何关于标题本身的语法或如何指定域变体的留档。

根据对一个相关问题的回答,我尝试了以下方法:

<FilesMatch "\.(ttf|otf|eot|woff|svg)$">
    <IfModule mod_headers.c>
        SetEnvIf Origin "http(s)?://(www\.)?(example.com)$" AccessControlAllowOrigin=$0$1
        Header add Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin
        Header set Access-Control-Allow-Credentials true
    </IfModule>
</FilesMatch>

我的理解是,这将为每个请求设置一个单独的标题,允许每个请求页面单独使用字体。不过,在检查Firebug时,标题似乎总是<代码>http://example.com,在主页和其他地方。尽管如此,这是可行的,但让我感到困惑。一个相关的问题表明,类似的设置不适用于其他人。他的问题表明,对他来说,它实际上是为每个请求页面发送不同的标题,因此未修改的HTTP 304响应被破坏。他的解决方案是向添加一个始终指令。htaccess,但对我来说,这导致了HTTP 500错误。

现在,它正在工作,我认为在示例中继续工作。com将切换到HTTPS(很快就会)。然而,我忍不住觉得这太复杂了。它每次都设置相同的标题,但使用复杂的模式匹配来实现。此外,虽然我对HTTP 304 Not Modified(未修改)响应没有任何问题(事实上,我还没有看到任何此类响应:在清除缓存之前,浏览器根本不会请求字体文件),但我担心将来可能会看到它们。


共有2个答案

司寇光华
2023-03-14

作为参考,我出于同样的目的更新了/etc/apache2/conf/sites-enabled/*文件。我的代码:

   <Directory /var/www/dir>
     AllowOverride FileInfo Options
     Header set Access-Control-Allow-Origin "http://example.com"
     Header set Access-Control-Allow-Origin "http://www.example.com"
   </Directory>

我必须处理的一件事是,我没有启用mod_头,因此重新启动apache失败。我必须用

a2enmods headers
於乐
2023-03-14
匿名用户

如CORS规范所述,您只能在Access-Control-Allow-Origin标头(或*null)中拥有一个域。

所以是的,您需要根据请求站点的域以不同的方式设置标头。这就是为什么您发布的apache配置片段尝试使用此正则表达式在请求的Origin标头上匹配:

http(s)?://(www\.)?(example.com)$

$匹配字符串末尾。因此,此正则表达式将匹配来自http://www.example.comhttp://example.com及其https等价物的请求,但不匹配example.com/bla。这应该没问题,因为请求的Origin标头以及响应的Access-Control-Allow-Origin标头应该只包含主机而不包含子页。

所以当你在页面上时http://example.com/about-us,浏览器将发送如下请求,以从http://cdn.net/myfont.otf

GET /myfont.otf HTTP/1.1
Host: http://cdn.net
Origin: http://example.com

在那里,服务器将在原始标头上进行模式匹配,并返回:

Access-Control-Allow-Origin: http://example.com

 类似资料:
  • 问题内容: 将web.xml移植到Java配置后出现以下问题 根据一些Spring参考,尝试了以下尝试: 所选择的值来自有效的web.xml过滤器: 有什么想法为什么Spring java config方法不能像web.xml文件那样工作? 问题答案: 将CorsMapping从更改方法。 为整个应用程序启用CORS很简单: 你可以轻松更改任何属性,以及仅将此CORS配置应用于特定的路径模式: 控

  • Response.AddHeader(“Access-Control-Allow-Origin”,“*”)是如何实现的;行设置多个标题时,包括,但没有当我删除它?

  • 问题内容: 我需要通过JavaScript 将数据发送到Python服务器。因为我使用的是localhost,所以我需要使用CORS。我正在使用Flask框架及其模块。 作为JavaScript,我有这个: 和Python代码: 但是当我执行它时,我收到以下消息: 我该如何解决?我知道我需要使用一些“ Access-Control-Allow-Origin”标头,但我不知道如何在此代码中实现它。顺

  • 我从ASP.NET表单中调用这个函数,在调用Ajax时在firebug控制台中得到以下错误。 跨源请求被阻止:同一源策略不允许读取http://anotherdomain/test.json上的远程资源。(原因:CORS标头“Access-Control-Allow-Origin”丢失)。 我做了其他的方法,但仍然找不到解决办法。 注意:我没有服务器权限进行服务器端(API/URL)更改。

  • 问题内容: 我想访问来自同一域但端口号不同的信息,为此,我添加了响应头。 Servlet代码:( 显示在www.example.com:PORT_NUMBER上) jQuery代码:( 显示在www.example.com上) 几次我收到此错误(在控制台中): 该错误通常在执行时首次发生。第二次允许。 我的问题是代码中或代码中缺少什么? 任何建议将不胜感激。 更新1 我变了: 至: 然后我在控制台