Devolver "200 OK" en Apache en solicitudes de OPCIONES HTTP

12

Estoy intentando implementar el control de acceso HTTP entre dominios sin tocar ningún código.

Tengo mi servidor Apache (2) devolviendo los encabezados de control de acceso correctos con este bloque:

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

Ahora necesito evitar que Apache ejecute mi código cuando el navegador envía una HTTP OPTIONSsolicitud (se almacena en la REQUEST_METHODvariable de entorno), regresando 200 OK.

¿Cómo puedo configurar Apache para que responda "200 OK" cuando el método de solicitud es OPTIONS?

He intentado este mod_rewritebloque, pero los encabezados de Control de acceso se pierden.

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

Respuestas:

12

Está agregando un encabezado a una respuesta no exitosa (no 2xx), como una redirección, en cuyo caso solo la tabla correspondiente a siempre se usa en la respuesta final.

"Conjunto de encabezado" correcto:

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

Si configura un directorio para acceso autenticado, los navegadores como Chrome y Safari (tal vez otros también) siempre envían una solicitud de OPCIONES sin credencial antes de la llamada XmlHttpRequest, que siempre obtiene 401 y falla si no configuramos el archivo .htaccess / configuración de apache para permitir el método OPTIONS sin requerir autenticación. ¡Eso me volvió loco durante 2 días y ese es el tipo de información "esotérica" ​​que los webmasters mantienen en secreto, supongo! De todos modos configuré mi .htaccess de esta manera y ahora funciona:

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

Luego debe configurar los encabezados correctamente en los scripts PHP.

La Muerte Peluda
fuente
1
Esa última línea es importante. Si el servicio web subyacente no puede manejar la OPTIONSsolicitud, recibirá un error 404.
user2297366
7

Algunas veces este approuch puede ayudar:

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

Es útil cuando tienes un servidor tipo apache

Nick Olszanski
fuente
desbloqueó solicitudes para mí. asombrosamente. en apache 2.4 ¡Con esta regla en blank.html eso no existe!
Nadir