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]       

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"

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.


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


desbloqueou pedidos para mim. surpreendentemente. no apache 2.4 Com esta regra no blank.html que não existe!
Nadir
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.