2016-06-27 2 views
0

Я пытаюсь включить CORS на свой сервер. Он содержит как Apache HTTPD, так и Apache Tomee. HTTPD сконфигурирован как:httpd duplicate Access-Control-Allow-Origin с «Header always set»

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 дважды в ответ на запрос предполетной 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. Кроме того, если я удаляю ключевое слово «всегда», он возвращает только один Access-Control-Allow-Origin ...

+0

Я бы сделал tcp дамп между httpd и посмотрел, куда добавляются дополнительные заголовки –

+0

У меня такая же проблема, но удаление ключевого слова «always» не исправляет ее, запросы по-прежнему включают дубликаты заголовков. Apache 2.4.25 – GraduateOfAcmeU

ответ

1

Испытывая аналогичную проблему. Отработал много времени в отладке.

Это ошибка в Apache. Неисправность внутреннего дизайна и невозможность его документирования.

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

Это команда управления заголовками. В apache есть как минимум две таблицы cookie.

  • onsuccess, по умолчанию, используется для кодов состояния 20X.
  • always, используемый для ошибок, включая коды переадресации.

Судя по моему опыту в дикой природе, все куки из всех таблиц добавляются к ответу.

В вашем примере cookie, установленный Tomcat, находится в таблице onsuccess, настройки cookie в apache находятся в таблице всегда. Ответ получает как куки, так и дублирование.

Это становится более грязным, чем это. Таблицы имеют разное значение в зависимости от того, какие модули используются. Например, при использовании прокси или CGI соответствующая таблица для файлов cookie равна onsuccess, если восходящий сервер успешно отправляет ошибку , но always, если возникает внутренняя ошибка apache.

Это поведение не документировано. Это кажется не преднамеренным, а следствием внутренних компонентов Apache. В текущем состоянии, как правило, невозможно правильно манипулировать заголовками с помощью Apache.

Смежные вопросы