【问题标题】:httpd duplicate Access-Control-Allow-Origin with "Header always set"httpd 重复 Access-Control-Allow-Origin 并带有“始终设置标题”
【发布时间】:2016-10-29 10:54:47
【问题描述】:

我正在尝试在我的服务器上启用 CORS。它同时托管 Apache HTTPD 和 Apache Tomee。 HTTPD 配置为:

SetEnvIf Origin "^https://(.+\.)?my-domain.com$" allowed_origin=$0
Header always set Access-Control-Allow-Origin %{allowed_origin}e env=allowed_origin
Header set Access-Control-Allow-Credentials "true"
Header set Access-Control-Allow-Methods "GET, POST, OPTIONS, HEAD, PUT, DELETE, PATCH"
Header set Access-Control-Allow-Headers "accept,x-requested-method,origin,x-requested-with,x-request,cache-control,content-type"
Header set Access-Control-Max-Age "600"

还有我的 Tomee Web XML:

<filter>
  <filter-name>CorsFilter</filter-name>
  <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
  <init-param>
    <param-name>cors.allowed.headers</param-name>
    <param-value>Origin,Accept,X-Requested-With,Content-Type,Access-Control-Request-Method,Access-Control-Request-Headers,Accept-Language,Keep-Alive</param-value>
  </init-param>
  <init-param>
    <param-name>cors.allowed.methods</param-name>
    <param-value>GET,POST,HEAD,OPTIONS,PUT,PATCH,DELETE</param-value>
  </init-param>
</filter>
<filter-mapping>
  <filter-name>CorsFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

我的问题是我在对预检 OPTIONS 请求的响应中获得了两次 Access-Control-Allow-Credentials 标头:

HTTP/1.1 200 OK
Access-Control-Allow-Origin: https://my-origin.my-domain.com
Access-Control-Allow-Origin: https://my-origin.my-domain.com
Access-Control-Allow-Credentials: true
Access-Control-Max-Age: 600
Access-Control-Allow-Methods: GET, POST, OPTIONS, HEAD, PUT, DELETE, PATCH
Access-Control-Allow-Headers: accept,x-requested-method,origin,x-requested-with,x-request,cache-control,content-type,authorization

我不明白为什么在我的 HTTPD 配置中使用 set 关键字不会删除重复的 Access-Control-Allow-Origin。 此外,如果我删除 'always' 关键字,它只会返回一个 Access-Control-Allow-Origin...

【问题讨论】:

  • 我会在 httpd 之间做一个 tcp 转储,看看在哪里添加了额外的标头
  • 我遇到了类似的问题,但删除“always”关键字并不能解决问题,请求仍然包含重复的标头。阿帕奇 2.4.25

标签: apache http-headers cors apache-tomee


【解决方案1】:

遇到类似问题。花了很多时间调试。

这是 Apache 中的一个错误。内部设计的失败和记录失败。

Header [table] set [cookie] [value] [...]

这是操纵标头的命令。 apache中至少有两个cookie表。

  • onsuccess,默认,用于 20X 状态码。
  • always,用于错误,包括重定向代码。

根据我在野外的经验判断,所有表中的所有 cookie 都附加到响应中。

在你的例子中,Tomcat设置的cookie在onsuccess表中,apache中的cookie设置在always表中。响应获取两个 cookie,因此是重复的。

它变得比这更混乱。根据使用的模块,这些表具有不同的含义。例如,在使用代理或 CGI 时,如果上游服务器发送错误成功,则 cookie 的相关表为 onsuccess,但如果发生内部 apache 错误,则为 always

此行为未记录在案。这似乎不是故意的,而是 apache 内部结构的结果。在目前的状态下,用 Apache 正确操作 header 基本上是不可能的。

【讨论】:

  • bz.apache.org/bugzilla/show_bug.cgi?id=61860 讨论了这个问题并包含一个补丁(已经合并到主干中)。
  • 非常感谢......完美的答案。我发现了这个问题,只有这个答案才能解决我的问题。
【解决方案2】:

接受的答案是正确的。这只是我一直在使用的一种处理方式。

SetEnvIf Origin "^(.*(\.yoursite.com)[:0-9]*)$" cors=$1
# wash out these headers in the 'onsuccess' table if we get them from the backend
Header onsuccess unset Access-Control-Allow-Origin env=cors
Header onsuccess unset Access-Control-Allow-Credentials env=cors
Header onsuccess unset Access-Control-Allow-Methods env=cors
Header onsuccess unset Access-Control-Allow-Headers env=cors
# add them to the 'always' table
Header always set Access-Control-Allow-Origin %{cors}e env=cors
Header always set Access-Control-Allow-Credentials "true" env=cors
Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS, PUT, DELETE" env=cors
Header always set Access-Control-Allow-Headers "accept,x-requested-method,origin" env=cors

【讨论】:

    猜你喜欢
    • 2018-06-24
    • 2018-11-17
    • 2016-07-21
    • 2018-12-13
    • 2018-02-17
    • 1970-01-01
    • 2019-02-06
    • 2016-08-12
    • 2013-01-04
    相关资源
    最近更新 更多