httpd 与 "Header always set" 重复 Access-Control-Allow-Origin
httpd duplicate Access-Control-Allow-Origin with "Header always set"
我正在尝试在我的服务器上启用 CORS。它同时托管 Apache HTTPD 和 Apache Tomee。
HTTPD 配置为:
SetEnvIf Origin "^https://(.+\.)?my-domain.com$" allowed_origin=[=12=]
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 网站 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>
我的问题是在对预检选项请求的响应中我得到了两次 Access-Control-Allow-Credentials
header :
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' 关键字,它只会 returns 一个 Access-Control-Allow-Origin
...
遇到类似问题。花了很多时间调试。
这是 Apache 中的错误。内部设计的失败和记录失败。
Header [table] set [cookie] [value] [...]
这是操纵headers的命令。 apache 中至少有两个 cookie table。
onsuccess
,默认,用于20X状态码。
always
,用于错误,包括重定向代码。
根据我在野外的经验判断,来自所有 table 的所有 cookie 都附加到响应中。
在你的例子中,Tomcat设置的cookie在onsuccesstable,apache设置的cookie在alwaystable。响应获得两个 cookie,因此重复。
比那更乱。 table 具有不同的含义,具体取决于所使用的模块。例如,当使用代理或 CGI 时,如果上游服务器传送错误成功,则 cookie 的相关 table 是 onsuccess
,但如果发生内部 apache 错误。
没有记录此行为。这似乎不是故意的,而是 apache 内部结构的结果。在目前的状态下,基本不可能用Apache来正确操作headers。
接受的答案是正确的。这只是我一直在使用的一种处理方式。
SetEnvIf Origin "^(.*(\.yoursite.com)[:0-9]*)$" cors=
# 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
我正在尝试在我的服务器上启用 CORS。它同时托管 Apache HTTPD 和 Apache Tomee。 HTTPD 配置为:
SetEnvIf Origin "^https://(.+\.)?my-domain.com$" allowed_origin=[=12=]
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 网站 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>
我的问题是在对预检选项请求的响应中我得到了两次 Access-Control-Allow-Credentials
header :
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' 关键字,它只会 returns 一个 Access-Control-Allow-Origin
...
遇到类似问题。花了很多时间调试。
这是 Apache 中的错误。内部设计的失败和记录失败。
Header [table] set [cookie] [value] [...]
这是操纵headers的命令。 apache 中至少有两个 cookie table。
onsuccess
,默认,用于20X状态码。always
,用于错误,包括重定向代码。
根据我在野外的经验判断,来自所有 table 的所有 cookie 都附加到响应中。
在你的例子中,Tomcat设置的cookie在onsuccesstable,apache设置的cookie在alwaystable。响应获得两个 cookie,因此重复。
比那更乱。 table 具有不同的含义,具体取决于所使用的模块。例如,当使用代理或 CGI 时,如果上游服务器传送错误成功,则 cookie 的相关 table 是 onsuccess
,但如果发生内部 apache 错误。
没有记录此行为。这似乎不是故意的,而是 apache 内部结构的结果。在目前的状态下,基本不可能用Apache来正确操作headers。
接受的答案是正确的。这只是我一直在使用的一种处理方式。
SetEnvIf Origin "^(.*(\.yoursite.com)[:0-9]*)$" cors=
# 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