Spécifier Plusieurs sous-Domaines avec le Contrôle d'Accès d'Origine
Je suis en train de permettre l'accès à tous les sous-domaine sur mon site afin de permettre à la croix-domaine des appels AJAX. Est-il un moyen de spécifier tous les sous-domaines d'un site comme *.example.com
ou sinon, pourquoi ne le suivant pas de travail quand j'ai plus d'un domaine répertoriés:
header('Access-Control-Allow-Origin: http://api.example.com http://www.example.com');
J'ai lu à travers la question suivante qui semble être le même, si ce n'est le même que celui-ci, autre que le fait que je veux avoir accès à des sous-domaines et celui-ci se réfère à des domaines généraux.
Access-Control-Allow-Origin Plusieurs Domaines D'Origine?
Si la question ci-dessus est la solution à ce problème, alors comment suis-je en mesure de récupérer à l'origine de l'en-tête. Il semble que $_SERVER['HTTP_ORIGIN'] est très peu fiable et pas même de la croix-navigateur. J'ai besoin d'être en mesure de voir l'origine dans n'importe quel navigateur qui peut indiquer une erreur lorsque vous tentez d'envoyer un appel AJAX à l'aide de javascript.
- Comme vous l'avez dit, la première partie de la réponse à votre question dans le lien. Concernant votre deuxième question: si le navigateur tente un appel Ajax qui est interdit par la Croix Domaine des Politiques, la demande échoue et ne pas atteindre le serveur. L'erreur devra être traitée dans le navigateur.
- Je suis conscient que je vais recevoir une erreur, mais cette erreur sera fourni après que l'appel a tenté d'accéder au fichier externe. Si le fichier rejette alors l'erreur sera levée. Si j'ai la tête pour permettre l'accès à tous, alors cela va fonctionner, mais c'est trop ouvert pour moi, donc je tiens à le définir pertinentes à l'origine de la demande. Donc, je voudrais savoir comment faire pour obtenir l'origine de la demande à l'aide de PHP.
- Pouvez-vous élaborer sur ce que vous entendez par "$_SERVER['HTTP_ORIGIN'] est très peu fiable et pas même de la croix-navigateur"? $_SERVER['HTTP_ORIGIN'] est un serveur-côté de la valeur qui n'est pas exécuté dans le navigateur.
- Oui, je suis d'accord et je suis un peu confus par elle non croix-navigateur compatible, mais j'ai vu ce qui a déclaré sur une autre question. Je n'ai jamais entendu parler de HTTP_ORIGIN et que vous souhaitez uniquement utiliser si je peux être sûr que cela fonctionne dans tous les navigateurs.
- stackoverflow.com/a/18958914/889949
Vous devez vous connecter pour publier un commentaire.
La solution à ce problème est d'utiliser la variable $_SERVER['HTTP_ORIGIN'] variable pour déterminer si la demande en est venu à partir d'un domaine autorisé. Il a ensuite mettez ceci:
Voici comment je l'ai fait.
La
Origin
en-tête est spécifiée par le navigateur et contiendra le domaine qui a demandé le script sur l'autre domaine:Par conséquent, vous pouvez la "liste blanche" de plusieurs domaines de votre script côté serveur:
Ce que vous pouvez ensuite faire est de vérifier si le
$_SERVER["HTTP_ORIGIN"]
global contient un domaine à l'intérieur de cette liste blanche:Et définir la
Access-Control-Allow-Origin
en-tête de réponse à ceOrigin
valeur d'en-tête est:Le script complet:
$_SERVER['HTTP_ORIGIN')
n'est pas toujours disponible, selon le navigateur. Vous pouvez remplacez la par:if (array_key_exists('HTTP_ORIGIN', $_SERVER)) { $origin = $_SERVER['HTTP_ORIGIN']; } else if (array_key_exists('HTTP_REFERER', $_SERVER)) { $origin = $_SERVER['HTTP_REFERER']; } else { $origin = $_SERVER['REMOTE_ADDR']; }
Alors que la réponse des travaux, il ne l'encontre de la finalité de la chose, puisqu'il permet à des demandes de n'importe quel hôte.
- Je utiliser quelque chose comme:
J'ai essayé d'utiliser cette approche pour atteindre contrainte sur un domaine spécifique de base:
J'espère que cela fonctionne.
Voici un bon Article au sujet de votre Question:
http://hacks.mozilla.org/2009/07/cross-site-xmlhttprequest-with-cors/
Si ce n'est pas assez bon ou ne fonctionne pas, soit vous avez besoin d'un Proxy comme ceci:
https://raw.github.com/cowboy/php-simple-proxy/master/ba-simple-proxy.php
Vous pouvez appeler le Proxy avec des Paramètres comme:
http://www.example.com/ba-simple-proxy.php?url=https://api.example.com