vhost - header set access-control-allow-origin*apache



La demande de contrôle en amont n'est pas traitée par apache(CORS) (1)

Les deux choses principales que vous devez changer / ajouter sont:

  • Utilisez l'en- Header always set au lieu de seulement l' Header set
  • Utilisez mod_rewrite pour gérer les OPTIONS en renvoyant simplement un 200 OK avec ces en-têtes

Donc, pour activer la requête dans la question, voici un extrait de configuration minimal (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]

Plus d'explications sur https://benjaminhorn.io/code/setting-cors-cross-origin-resource-sharing-on-apache-with-correct-response-headers-allowing-everything-through/

Quelques remarques générales sur les valeurs à définir pour les différents en Access-Control- têtes Access-Control- response:

  • Access-Control-Allow-Headers : vous devez le définir pour inclure tous les noms d'en-tête envoyés par votre requête, sauf les noms d'en-tête CORS-safelisted ou les noms d'en-tête "interdits" (noms des en-têtes définis par le navigateur que vous ne pouvez pas définir votre JavaScript); la spécification permet alternativement le * wildcard comme sa valeur-donc vous pouvez l'essayer un jour, mais aucun navigateur ne le supporte encore: bug Chrome, bug Firefox, bug Safari

  • Access-Control-Allow-Methods : la spécification autorise alternativement le caractère générique * mais, comme avec Access-Control-Allow-Headers: * , aucun navigateur ne le supporte pour le moment

  • Access-Control-Expose-Headers : vous devez définir pour inclure les en-têtes de réponse que votre code client doit lire au Cache-Control delà Cache-Control , Content-Language , Content-Type , Expires , Last-Modified et Pragma -qui sont exposés par défaut (un beaucoup de gens oublient de mettre cela et finissent par se demander pourquoi ils ne peuvent pas lire la valeur d'un en-tête de réponse particulier); encore une fois la spécification permet alternativement le * wildcard ici, mais aucun navigateur ne le supporte encore

  • Access-Control-Max-Age : Chrome a une limite supérieure de 600 (10 minutes) codée en dur , donc il ne sert à rien de lui attribuer une valeur plus élevée (Firefox peut la respecter, mais Chrome l'étrangle à 10 minutes si vous le définissez plus haut, et Safari le limite à seulement 5 minutes)

Alors, à propos de la demande particulière montrée dans la question, voici quelques notes spécifiques:

  • Votre requête dispose d'une Access-Control-Request-Headers:authorization dans votre configuration Apache, ajoutez également Authorization dans l'en Access-Control-Allow-Headers tête de réponse Access-Control-Allow-Headers .

  • Origin est un nom d'en-tête «interdit» défini par le navigateur, et Accept est un nom d'en-tête répertorié dans la liste CORS, vous n'avez donc pas besoin de les inclure dans Access-Control-Allow-Headers

  • Votre requête n'envoie aucun Content-Type , donc elle n'est pas nécessaire dans Access-Control-Allow-Headers dans la réponse (et jamais nécessaire pour GET requêtes GET et n'est nécessaire que si le type est autre que application/x-www-form-urlencoded , text/plain ou multipart/form-data )

  • Pour Access-Control-Allow-Methods , votre requête semble être simplement un GET , donc à moins que vous n'ayez l'intention de faire aussi des requêtes POST / PUT / DELETE / PATCH , inutile de les inclure explicitement

Général:

Request URL:x/site.php
Request Method:OPTIONS
Status Code:302 Found
Remote Address:x.x.x.x:80

En-têtes de réponse:

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)

En-têtes de demande:

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 configuration d'Apache VirtualHost ressemble à ceci:

    <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 demande de contrôle en amont saute la config apache et frappe ma webapp directement, ce qui fait une redirection (d'où le 302 et l'emplacement: y).

Je ne sais pas pourquoi la requête preflight n'est pas traitée par apache?





preflight