httpd дубликата Access-Control-Allow-Origin с "Заголовок всегда установлен"
Я пытаюсь включить 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 веб 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
заголовок дважды в ответе на запрос preflight OPTIONS:
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
Я не понимаю, почему использование set
Ключевое слово в моей конфигурации HTTPD не удаляет дубликат Access-Control-Allow-Origin
, Более того, если я удаляю ключевое слово Always, оно возвращает одно Access-Control-Allow-Origin
только...
2 ответа
Испытывает похожую проблему. Потратил много времени на отладку.
Это ошибка в Apache. Несостоятельность внутреннего дизайна и не документирование.
Header [table] set [cookie] [value] [...]
Это команда для манипулирования заголовками. В apache есть как минимум две таблицы cookie.
onsuccess
по умолчанию используется для 20X кодов состояния.always
, используется для ошибок, в том числе перенаправляет коды.
Судя по моему опыту в дикой природе, все куки со всех таблиц добавляются к ответу.
В вашем примере набор файлов cookie, заданный Tomcat, находится в таблице onsuccess, наборы файлов cookie в apache находятся в таблице всегда. Ответ получает оба куки, отсюда и дублирование.
Это становится более грязным, чем это. Таблицы имеют различное значение в зависимости от того, какие модули используются. Например, при использовании прокси или CGI соответствующая таблица для файлов cookie onsuccess
если вышестоящий сервер доставляет ошибку успешно, но always
если происходит внутренняя ошибка apache.
Такое поведение не задокументировано. Это кажется не преднамеренным, а следствием внутренних механизмов Apache. В текущем состоянии, в принципе невозможно правильно манипулировать заголовками с Apache.
Принятый ответ правильный. Это просто способ справиться с этим, который я использовал.
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