Retornando "200 OK" no Apache em solicitações HTTP OPTIONS

12

Estou tentando implementar o controle de acesso HTTP entre domínios sem tocar em nenhum código.

Eu tenho meu servidor Apache (2) retornando os cabeçalhos de controle de acesso corretos com este bloco:

Header set Access-Control-Allow-Origin "*"                   
Header set Access-Control-Allow-Methods "POST, GET, OPTIONS" 

Agora, preciso impedir que o Apache execute meu código quando o navegador envia uma HTTP OPTIONSsolicitação (é armazenada na REQUEST_METHODvariável de ambiente), retornando 200 OK.

Como posso configurar o Apache para responder "200 OK" quando o método de solicitação é OPTIONS?

Eu tentei esse mod_rewritebloco, mas os cabeçalhos de controle de acesso estão perdidos.

RewriteEngine On                  
RewriteCond %{REQUEST_METHOD} OPTIONS 
RewriteRule ^(.*)$ $1 [R=200,L]       
Mark McDonald
fonte

Respostas:

12

Você está adicionando um cabeçalho a uma resposta sem êxito (não 2xx), como um redirecionamento; nesse caso, apenas a tabela correspondente a sempre é usada na resposta final.

"Conjunto de cabeçalhos" correto:

Header always set Access-Control-Allow-Origin "*"                   
Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS"
alvosu
fonte
7

Se você definir um diretório para acesso autenticado, navegadores como Chrome e Safari (talvez também outros) sempre enviarão uma solicitação OPTIONS sem credenciais antes da chamada XmlHttpRequest, que sempre obtém 401 e falha se não definirmos a configuração de arquivo / apache .htaccess para permitir o método OPTIONS sem exigir autenticação. Isso me deixou louco por 2 dias e esse é o tipo de informação "esotérica" ​​que os webmasters mantêm em segredo, eu acho! Enfim, configurei meu .htaccess assim e agora ele funciona:

AuthUserFile <path to password file>
AuthName "Thou shalt not pass!"
AuthType Basic
Options -Indexes
<LimitExcept OPTIONS>
  Require valid-user
</LimitExcept>

Então você deve definir os cabeçalhos corretamente nos scripts PHP.

La Muerte Peluda
fonte
1
Essa última linha é importante. Se o serviço da Web subjacente não puder lidar com a OPTIONSsolicitação, você receberá um erro 404.
precisa saber é o seguinte
7

Às vezes, essa aprovação pode ajudar:

<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]

É útil quando você tem um servidor semelhante ao apache

Nick Olszanski
fonte
desbloqueou pedidos para mim. surpreendentemente. no apache 2.4 Com esta regra no blank.html que não existe!
Nadir