Renvoyer «200 OK» dans Apache sur les requêtes HTTP OPTIONS

12

J'essaie d'implémenter un contrôle d'accès HTTP interdomaine sans toucher à aucun code.

J'ai mon serveur Apache (2) renvoyant les en-têtes de contrôle d'accès corrects avec ce bloc:

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

Je dois maintenant empêcher Apache d'exécuter mon code lorsque le navigateur envoie une HTTP OPTIONSdemande (il est stocké dans la REQUEST_METHODvariable d'environnement), en retournant 200 OK.

Comment puis-je configurer Apache pour répondre "200 OK" lorsque la méthode de demande est OPTIONS?

J'ai essayé ce mod_rewritebloc, mais les en-têtes de contrôle d'accès sont perdus.

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

Réponses:

12

Vous ajoutez un en-tête à une réponse non réussie (non 2xx), telle qu'une redirection, auquel cas seule la table correspondant à toujours est utilisée dans la réponse finale.

"Jeu d'en-têtes" correct:

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

Si vous définissez un répertoire pour un accès authentifié, les navigateurs tels que Chrome et Safari (peut-être d'autres aussi) envoient toujours une demande OPTIONS sans accréditation avant l'appel XmlHttpRequest, qui obtient toujours 401 et échoue si nous ne définissons pas la configuration du fichier .htaccess / apache pour autoriser la méthode OPTIONS sans exiger d'authentification. Cela m'a rendu fou pendant 2 jours et c'est le genre d'informations "ésotériques" que les webmasters gardent secrètes, je suppose! Quoi qu'il en soit, j'ai configuré mon .htaccess comme ceci et maintenant cela fonctionne:

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

Ensuite, vous devez définir correctement les en-têtes sur les scripts PHP.

La Muerte Peluda
la source
1
Cette dernière ligne est importante. Si le service Web sous-jacent ne peut pas gérer la OPTIONSdemande, vous recevrez une erreur 404.
user2297366
7

Parfois, cette approbation peut aider:

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

C'est utile quand vous avez un serveur de type apache

Nick Olszanski
la source
il a déverrouillé des demandes pour moi. étonnamment. sur apache 2.4 Avec cette règle sur blank.html qui n'existe pas!
Nadir