headers - La solicitud de comprobación previa no está siendo gestionada por apache(CORS)
cors php (1)
Las dos cosas principales que necesita cambiar / agregar son:
- Usar
Header always set
lugar de soloHeader set
- Use mod_rewrite para manejar las
OPTIONS
simplemente devolviendo un200 OK
con esos encabezados
Para que la solicitud en la pregunta funcione, aquí hay un fragmento de configuración mínimo (ish):
Header always set Access-Control-Allow-Origin "*"
Header always set Access-Control-Allow-Headers "Authorization"
Header always set Access-Control-Allow-Methods "GET, OPTIONS"
Header always set Access-Control-Expose-Headers "Content-Security-Policy, Location"
Header always set Access-Control-Max-Age "600"
RewriteEngine On
RewriteCond %{REQUEST_METHOD} OPTIONS
RewriteRule ^(.*)$ $1 [R=200,L]
Explicación más detallada en https://benjaminhorn.io/code/setting-cors-cross-origin-resource-sharing-on-apache-with-correct-response-headers-allowing-everything-through/
Algunas notas generales sobre qué valores establecer para los diversos encabezados de Access-Control-
respuesta:
Access-Control-Allow-Headers
: debe configurarlo para que incluya cualquier nombre de encabezado enviado por su solicitud, excepto los nombres de encabezado SAFS o nombres de encabezados "prohibidos" (nombres de encabezados configurados por el navegador que no puede establecer en tu JavaScript); la especificación permite alternativamente*
comodín como su valor, por lo que puede intentarlo algún día, pero ningún navegador lo admite aún: error de Chrome , error de Firefox , error de SafariAccess-Control-Allow-Methods
: la especificación permite alternativamente el*
comodín, pero de nuevo, como conAccess-Control-Allow-Headers: *
, ningún navegador lo admite todavíaAccess-Control-Expose-Headers
: debe configurar para incluir los encabezados de respuesta que su código de cliente necesita para leer más allá deCache-Control
,Content-Language
,Content-Type
,Expires
,Last-Modified
yPragma
-que están expuestos por defecto (a Mucha gente se olvida de configurar esto y termina desconcertada acerca de por qué no pueden leer el valor de un encabezado de respuesta particular; de nuevo, la especificación permite el*
comodín aquí, pero ningún navegador lo admite todavíaAccess-Control-Max-Age
: Chrome tiene un límite superior de600
(10 minutos) codificado , por lo que no tiene sentido establecer un valor más alto que eso (Firefox puede respetarlo, pero Chrome lo reducirá a 10 minutos) si lo configuras más alto, y Safari lo limita a solo 5 minutos)
Entonces, sobre la solicitud particular que se muestra en la pregunta, aquí hay algunas notas específicas:
Su solicitud tiene
Access-Control-Request-Headers:authorization
así que en su configuración de Apache, agregueAuthorization
en elAccess-Control-Allow-Headers
respuesta deAccess-Control-Allow-Headers
encabezados.Origin
es un nombre de encabezado "prohibido" establecido por el navegador, yAccept
es un nombre de encabezado SAFS de CORS, por lo que no es necesario que los incluya enAccess-Control-Allow-Headers
Su solicitud no envía
Content-Type
, por lo que no es necesaria enAccess-Control-Allow-Headers
en la respuesta (y nunca es necesaria para solicitudesGET
y solo es necesaria si el tipo es distinto deapplication/x-www-form-urlencoded
,text/plain
omultipart/form-data
)Para
Access-Control-Allow-Methods
, su solicitud parece ser solo unGET
, por lo tanto, a menos que planee realizarPOST
/PUT
/DELETE
/PATCH
, no tiene sentido incluirlas explícitamente.
General:
Request URL:x/site.php
Request Method:OPTIONS
Status Code:302 Found
Remote Address:x.x.x.x:80
Encabezados de respuesta:
view source
Access-Control-Allow-Headers:Content-Type
Access-Control-Allow-Origin:*
Access-Control-Max-Age:300
Cache-Control:no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Content-Length:0
Content-Type:text/html; charset=UTF-8
Date:Thu, 02 Mar 2017 14:27:21 GMT
Expires:Thu, 19 Nov 1981 08:52:00 GMT
Location:y
Pragma:no-cache
Server:Apache/2.4.25 (Ubuntu)
Encabezados de solicitud:
view source
Accept:*/*
Accept-Encoding:gzip, deflate, sdch
Accept-Language:en-US,en;q=0.8
Access-Control-Request-Headers:authorization
Access-Control-Request-Method:POST
Cache-Control:no-cache
Connection:keep-alive
DNT:1
Host:x
Origin:http://127.0.0.1:3000
Pragma:no-cache
Referer:http://127.0.0.1:3000/
User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.90 Safari/537.36
La configuración de Apache virtualhost se ve así:
<IfModule mod_headers.c>
Header set Access-Control-Allow-Origin "http://127.0.0.1:3000"
Header set Access-Control-Allow-Origin "http://127.0.0.1"
Header set Access-Control-Max-Age "300"
Header set Access-Control-Allow-Credentials "true"
Header set Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept"
Header set Access-Control-Allow-Methods "POST, GET, PUT, DELETE, PATCH, OPTIONS"
</IfModule>
La solicitud de verificación previa omite la configuración de apache y golpea mi aplicación web directamente, lo que hace una redirección (de ahí el 302 y la ubicación: y).
No sé por qué la solicitud de verificación previa no está siendo manejada por apache?