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