origin headers habilitar control chrome allow apache http cors ip preflight

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 solo Header set
  • Use mod_rewrite para manejar las OPTIONS simplemente devolviendo un 200 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 Safari

  • Access-Control-Allow-Methods : la especificación permite alternativamente el * comodín, pero de nuevo, como con Access-Control-Allow-Headers: * , ningún navegador lo admite todavía

  • Access-Control-Expose-Headers : debe configurar para incluir los encabezados de respuesta que su código de cliente necesita para leer más allá de Cache-Control , Content-Language , Content-Type , Expires , Last-Modified y Pragma -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ía

  • Access-Control-Max-Age : Chrome tiene un límite superior de 600 (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, agregue Authorization en el Access-Control-Allow-Headers respuesta de Access-Control-Allow-Headers encabezados.

  • Origin es un nombre de encabezado "prohibido" establecido por el navegador, y Accept es un nombre de encabezado SAFS de CORS, por lo que no es necesario que los incluya en Access-Control-Allow-Headers

  • Su solicitud no envía Content-Type , por lo que no es necesaria en Access-Control-Allow-Headers en la respuesta (y nunca es necesaria para solicitudes GET y solo es necesaria si el tipo es distinto de application/x-www-form-urlencoded , text/plain o multipart/form-data )

  • Para Access-Control-Allow-Methods , su solicitud parece ser solo un GET , por lo tanto, a menos que planee realizar POST / 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?