Назад | Перейти на главную страницу

Возврат «200 OK» в Apache по запросам HTTP OPTIONS

Я пытаюсь реализовать междоменный Контроль доступа 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-подобный сервер