Как установить заголовок Access-Control-Allow-Origin для ответа базовой аутентификации HTTP в Apache? - PullRequest
3 голосов
/ 11 сентября 2011

Я хочу использовать XHR для входа на сайт, использующий базовую аутентификацию HTTP. Следующая часть делает это.

http = new XMLHttpRequest();
http.open("get", "http://...", false, username, password);
http.send("");

Проблема в том, что этот не работает из домена, отличного от того, где находится аутентификация. Решение достаточно простое: установите заголовок Access-Control-Allow-Origin на *. Поэтому я изменил свою конфигурацию Apache на это:

<Location />
    Header set Access-Control-Allow-Origin "*"

    AuthType Basic
    AuthName "trac"
    AuthUserFile /home/admin/development/pass.htpasswd
    Require valid-user
</Location>

Ответы с этой страницы выглядят так:

HTTP/1.1 401 Authorization Required
Connection: Keep-Alive
Content-Encoding: gzip
Content-Length: 345
Content-Type: text/html; charset=iso-8859-1
Date: Sun, 11 Sep 2011 01:17:55 GMT
Keep-Alive: timeout=15, max=100
Vary: Accept-Encoding
WWW-Authenticate: Basic realm="trac"

Ответы не имеют заголовка Access-Control-Allow-Origin. Это кажется странным.

Когда я использую одну и ту же директиву Header для внутренних страниц, заголовок устанавливается.

Почему не был установлен заголовок? Как установить заголовок Access-Control-Allow-Origin для ответа базовой аутентификации HTTP в Apache?

1 Ответ

4 голосов
/ 06 ноября 2013

Ответ:

Header always set Access-Control-Allow-Origin "*"

вместо

Header set Access-Control-Allow-Origin "*"

И причина в документации директивы Header :

Header [condition] set|append|merge|add|unset|echo|edit header [value] [replacement] [early|env=[!]variable]

Необязательный аргумент условия определяет, с какой внутренней таблицей заголовков ответов будет работать эта директива.Другие компоненты сервера могут хранить свои заголовки ответов либо в таблице, которая соответствует onsuccess, либо в таблице, которая соответствует всегда. «Всегда» в этом контексте относится к тому, будут ли добавленные вами заголовки отправляться как во время успешного, так и неудачного ответа, но если ваше действие является функцией существующего заголовка, вам придется читать дальше для дальнейших осложнений..

Значение onsuccess по умолчанию может потребоваться изменить на всегда при обстоятельствах, аналогичных перечисленным ниже.Также обратите внимание, что повторение этой директивы с обоими условиями имеет смысл в некоторых сценариях, потому что всегда не является надмножеством onsuccess по отношению к существующим заголовкам:

  • Вы добавляете заголовок к не-ответ об успешном (не 2xx), например, перенаправление, в этом случае в окончательном ответе используется только таблица, соответствующая всегда.
  • Вы изменяете или удаляете заголовок, созданный CGIсценарий, в этом случае сценарии CGI находятся в таблице, соответствующей всегда, а не в таблице по умолчанию.
  • Вы изменяете или удаляете заголовок, сгенерированный некоторым элементом сервера, но этот заголовок не найденпо умолчанию при условии успешного завершения.

В вашем случае вы отправляете ответ 401 вместо классического ответа 200, а заголовок устанавливается только на 200 ответов, если вы не используете ключевое слово always.

...