Я пытаюсь реализовать междоменный Контроль доступа HTTP не касаясь кода.
У меня есть сервер Apache (2), возвращающий правильные заголовки контроля доступа с этим блоком:
Header set Access-Control-Allow-Origin "*"
Header set Access-Control-Allow-Methods "POST, GET, OPTIONS"
Теперь мне нужно запретить Apache выполнять мой код, когда браузер отправляет HTTP OPTIONS
запрос (он хранится в REQUEST_METHOD
переменная среды), возвращая 200 OK
.
Как я могу настроить Apache для ответа «200 OK», когда метод запроса - OPTIONS?
Я пробовал это mod_rewrite
блок, но заголовки контроля доступа теряются.
RewriteEngine On
RewriteCond %{REQUEST_METHOD} OPTIONS
RewriteRule ^(.*)$ $1 [R=200,L]
Вы добавляете заголовок к неуспешному (не 2xx) ответу, например к перенаправлению, и в этом случае в окончательном ответе используется только таблица, соответствующая always.
Правильный «набор заголовков»:
Header always set Access-Control-Allow-Origin "*"
Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS"
Если вы устанавливаете каталог для аутентифицированного доступа, браузеры, такие как Chrome и Safari (возможно, другие тоже), всегда отправляют некредитованный запрос OPTIONS перед вызовом XmlHttpRequest, который всегда получает 401 и терпит неудачу, если мы не устанавливаем файл .htaccess / конфигурацию apache чтобы разрешить метод OPTIONS без необходимости аутентификации. Это свело меня с ума на 2 дня, и я думаю, это та "эзотерическая" информация, которую веб-мастера держат в секрете! В любом случае я настроил свой .htaccess вот так, и теперь он работает:
AuthUserFile <path to password file>
AuthName "Thou shalt not pass!"
AuthType Basic
Options -Indexes
<LimitExcept OPTIONS>
Require valid-user
</LimitExcept>
Затем вам нужно правильно установить заголовки в сценариях PHP.
Иногда такой подход может помочь:
<IfModule mod_headers.c>
Header add Access-Control-Allow-Origin "*"
Header add Access-Control-Allow-Headers "origin, content-type"
Header add Access-Control-Allow-Methods "PUT, GET, POST, DELETE, OPTIONS"
</IfModule>
RewriteEngine On
RewriteCond %{REQUEST_METHOD} OPTIONS
RewriteRule ^(.*)$ blank.html [QSA,L]
Это полезно, когда у вас есть apache-подобный сервер