httpd duplicate Access-Control-Allow-Origin with“Header always set”

时间:2016-06-27 12:15:18

标签: apache http-headers cors tomee

我正在尝试在我的服务器上启用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 ...

2 个答案:

答案 0 :(得分:2)

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

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

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

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

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

根据我在野外的经验,所有表中的所有cookie都会附加到回复中。

在您的示例中,Tomcat设置的cookie位于onsuccess表中,apache中的cookie集位于always表中。响应得到两个cookie,因此重复。

它比那更混乱。这些表具有不同的含义,具体取决于所使用的模块。例如,当使用代理或CGI时,如果上游服务器成功发送错误,则相关的cookie表为onsuccess,如果发生内部apache错误,则为always。 / p>

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

答案 1 :(得分:2)

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

{{1}}
相关问题