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 setlugar de soloHeader set - Use mod_rewrite para manejar las
OPTIONSsimplemente devolviendo un200 OKcon 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-ModifiedyPragma-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:authorizationasí que en su configuración de Apache, agregueAuthorizationen elAccess-Control-Allow-Headersrespuesta deAccess-Control-Allow-Headersencabezados.Origines un nombre de encabezado "prohibido" establecido por el navegador, yAcceptes un nombre de encabezado SAFS de CORS, por lo que no es necesario que los incluya enAccess-Control-Allow-HeadersSu solicitud no envía
Content-Type, por lo que no es necesaria enAccess-Control-Allow-Headersen la respuesta (y nunca es necesaria para solicitudesGETy solo es necesaria si el tipo es distinto deapplication/x-www-form-urlencoded,text/plainomultipart/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?