J'utilise .htaccess pour réécrire les URL et j'ai utilisé les balises de base html afin de le faire fonctionner.
Maintenant, quand j'essaye de faire une requête ajax, j'obtiens l'erreur suivante:
XMLHttpRequest ne peut pas charger
http://www.example.com/login.php
. Aucun en-tête 'Access-Control-Allow-Origin' n'est présent sur la ressource demandée. L'origine 'http://example.com
' n'est donc pas autorisée.
Utilisez addHeader
Au lieu d'utiliser la méthode setHeader
,
_response.addHeader("Access-Control-Allow-Origin", "*");
_
*
dans la ligne ci-dessus permettra access to all domains
.
Pour autoriser access to specific domain only
:
_response.addHeader("Access-Control-Allow-Origin", "http://www.example.com");
_
Vérifiez ceci blog post
.
Le code JavaScript est limité par le règle de même origine , ce qui signifie qu'à partir d'une page située en www.example.com
, vous ne pouvez effectuer que des requêtes (AJAX) vers des services situés à l'emplacement exactement le même domaine, dans ce cas, exactement www.example.com
( pas example.com
- sans le www
- ou whatever.example.com
).
Dans votre cas, votre code Ajax tente d’atteindre un service dans http://wordicious.com
à partir d’une page située sous http://www.wordicious.com
.
Bien que très similaires, ils ne sont pas le même domaine. Et quand ils ne sont pas sur le même domaine, la demande ne sera acceptée que si la réponse de la cible contient un en-tête Access-Control-Allow-Origin
.
Comme votre page/service sur http://wordicious.com
n'a jamais été configuré pour présenter un tel en-tête, ce message d'erreur s'affiche.
Comme dit, les domaines d'origine (où la page avec JavaScript est à) et les domaines cibles (où le JavaScript tente d'atteindre) doivent être les exact identiques .
Votre cas semble être une faute de frappe. On dirait que http://wordicious.com
et http://www.wordicious.com
sont en fait le même serveur/domaine. Donc, pour corriger cela, tapez la cible et l’origine de manière égale: affichez les pages/services de demande de code Ajax sur http://www.wordicious.com
et non http://wordicious.com
. (Vous pouvez éventuellement placer l'URL cible relativement, comme '/login.php'
, sans le domaine).
Si le problème n’est pas une faute de frappe comme celle de cette question semble l’être, la solution serait d’ajouter le Access-Control-Allow-Origin
au domaine cible Pour l'ajouter, cela dépend bien sûr du serveur/de la langue derrière cette adresse. Parfois, une variable de configuration dans l'outil fera l'affaire. D'autres fois, vous devrez ajouter vous-même les en-têtes dans le code.
Pour .NET, le serveur peut configurer cela dans web.config comme indiqué ci-dessous
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="your_clientside_websiteurl" />
</customHeaders>
</httpProtocol>
</system.webServer>
Par exemple, disons, si le domaine du serveur est http://live.makemypublication.com et que le client est http://www.makemypublication.com , configurez-le dans le Web du serveur. .config comme ci-dessous
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="http://www.makemypublication.com" />
</customHeaders>
</httpProtocol>
</system.webServer>
Si vous recevez ce message d'erreur du navigateur:
Aucun en-tête 'Access-Control-Allow-Origin' n'est présent sur la ressource demandée. Origine '…' n'est donc pas autorisé à accéder
lorsque vous essayez de faire une demande Ajax POST/GET à un serveur distant hors de votre contrôle, oubliez ce simple correctif:
<?php header('Access-Control-Allow-Origin: *'); ?>
Ce que vous devez vraiment faire, surtout si vous utilisez uniquement JavaScript pour effectuer la requête Ajax, est un proxy interne qui prend votre requête et l'envoie au serveur distant.
Tout d'abord dans votre JavaScript, effectuez un appel Ajax sur votre propre serveur, à peu près comme:
$.ajax({
url: yourserver.com/controller/proxy.php,
async:false,
type: "POST",
dataType: "json",
data: data,
success: function (result) {
JSON.parse(result);
},
error: function (xhr, ajaxOptions, thrownError) {
console.log(xhr);
}
});
Créez ensuite un simple fichier PHP appelé proxy.php pour envelopper vos données POST et les ajouter au serveur d'URL distant en tant que paramètres. Je vous donne un exemple de contournement de ce problème avec l’API de recherche d’hôtels Expedia:
if (isset($_POST)) {
$apiKey = $_POST['apiKey'];
$cid = $_POST['cid'];
$minorRev = 99;
$url = 'http://api.ean.com/ean-services/rs/hotel/v3/list?' . 'cid='. $cid . '&' . 'minorRev=' . $minorRev . '&' . 'apiKey=' . $apiKey;
echo json_encode(file_get_contents($url));
}
En faisant:
echo json_encode(file_get_contents($url));
Vous faites juste la même requête mais côté serveur et après cela, cela devrait fonctionner correctement.
Vous devez ajouter ceci au début de votre page php "login.php"
<?php header('Access-Control-Allow-Origin: *'); ?>
vous devez mettre les en-têtes clés/valeurs dans la réponse de la méthode des options. par exemple, si vous avez une ressource sur http://mydomain.com/myresource , dans votre code serveur, vous écrivez
//response handler
void handleRequest(Request request, Response response) {
if(request.method == "OPTIONS") {
response.setHeader("Access-Control-Allow-Origin","http://clientDomain.com")
response.setHeader("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE,OPTIONS");
response.setHeader("Access-Control-Allow-Headers", "Content-Type");
}
}
La solution de contournement consiste à utiliser un proxy inverse s'exécutant sur votre hôte "source" et transféré vers votre serveur cible, tel que Fiddler:
Lien ici: http://docs.telerik.com/fiddler/configure-fiddler/tasks/usefiddlerasreverseproxy
Ou un proxy inverse Apache ...
En gros, modifiez la réponse de l'en-tête de l'API en ajoutant les paramètres supplémentaires suivants.
Informations de contrôle d'accès autorisées: true
Access-Control-Allow-Origin: *
Mais ce n’est pas une bonne solution en matière de sécurité
Ajoutez ceci à votre fichier PHP ou à votre contrôleur principal
header("Access-Control-Allow-Origin: http://localhost:9000");
Résolu avec l'entrée ci-dessous dans httpd.conf
#CORS Issue
Header set X-Content-Type-Options "nosniff"
Header always set Access-Control-Max-Age 1728000
Header always set Access-Control-Allow-Origin: "*"
Header always set Access-Control-Allow-Methods: "GET,POST,OPTIONS,DELETE,PUT,PATCH"
Header always set Access-Control-Allow-Headers: "DNT,X-CustomHeader,Keep-Alive,Content-Type,Origin,Authentication,Authorization,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control"
Header always set Access-Control-Allow-Credentials true
#CORS REWRITE
RewriteEngine On
RewriteCond %{REQUEST_METHOD} OPTIONS
#RewriteRule ^(.*)$ $1 [R=200,L]
RewriteRule ^(.*)$ $1 [R=200,L,E=HTTP_Origin:%{HTTP:Origin}]]
Je rencontre ce problème lorsque j'utilise Angular
pour enregistrer un enregistrement dans le système Django REST
. Parfois, il n'y a pas de raison particulière à ce problème. Vérifiez attentivement le message d'erreur de votre Django, vous trouverez une solution.