javascript - Ingen 'Access-Control-Allow-Origin'-header finns på den begärda resursen. Ursprung '...' tillåts därför inte åtkomst
Jag använder .htaccess för att skriva om URL:er och jag använde HTML-bas-taggen för att få det att fungera.
Nu, när jag försöker göra en ajax-förfrågan får jag följande fel:
XMLHttpRequest kan inte ladda
http://www.example.com/login.php. Ingen 'Access-Control-Allow-Origin'-rubrik finns på den begärda resursen. Ursprung 'http://example.com' får därför inte åtkomst.
Svar #1
Använd addHeader istället för att använda setHeader-metoden,
response.addHeader("Access-Control-Allow-Origin", "*");
* i raden ovan kommer att tillåta åtkomst till alla domäner.
För att tillåta åtkomst till endast specifik domän:
response.addHeader("Access-Control-Allow-Origin", "http://www.example.com");
Kolla in detta blogginlägg.
Svar #2
Varför felet uppstår:
JavaScript-kod är begränsad av samma ursprungsprincip, vilket betyder att från en sida på www.example.com kan du endast göra (AJAX-)förfrågningar till tjänster som finns på exakt samma domän, i det fallet, exakt www.example.com (inte example.com - utan www - eller whatever.example.com).
I ditt fall försöker din Ajax-kod nå en tjänst på http://wordicious.com från en sida som finns på http://www.wordicious.com.
Även om de är mycket lika, är de inte samma domän. Och när de inte är på samma domän, kommer förfrågan bara att lyckas om målets svar innehåller en Access-Control-Allow-Origin-header.
Eftersom din sida/tjänst på http://wordicious.com aldrig konfigurerades för att visa en sådan rubrik, visas det felmeddelandet.
Lösning:
Som sagt, ursprunget (där sidan med JavaScript finns) och måldomänen (dit JavaScript försöker nå) måste vara exakt samma.
Ditt fall verkar som ett skrivfel. Det ser ut som http://wordicious.com och http://www.wordicious.com faktiskt är samma server/domän. Så för att fixa detta, skriv målet och ursprunget lika: få din Ajax-kod att begära sidor/tjänster från http://www.wordicious.com inte http://wordicious.com. (Kanske placera mål-URL:en relativt, som '/login.php', utan domänen).
På ett mer allmänt plan:
Om problemet inte är ett stavfel som det verkar vara i denna fråga, skulle lösningen vara att lägga till Access-Control-Allow-Origin till mål-domänen. Hur man lägger till det beror förstås på servern/språket bakom den adressen. Ibland räcker det med en konfigurationsvariabel i verktyget. Ibland måste du själv lägga till headers via kod.
Svar #3
För .NET-server kan detta konfigureras i web.config som visas nedan
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="your_clientside_websiteurl" />
</customHeaders>
</httpProtocol>
</system.webServer>
Till exempel, låt oss säga, om serverns domän är http://live.makemypublication.com och klienten är http://www.makemypublication.com, konfigurera då i serverns web.config som nedan
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="http://www.makemypublication.com" />
</customHeaders>
</httpProtocol>
</system.webServer>
Svar #4
Om du får detta felmeddelande från webbläsaren:
Ingen 'Access-Control-Allow-Origin'-header finns på den begärda resursen. Ursprung '…' tillåts därför inte åtkomst
när du försöker göra en Ajax POST/GET-förfrågan till en fjärrserver som du inte har kontroll över, vänligen glöm denna enkla lösning:
<?php header('Access-Control-Allow-Origin: *'); ?>
Vad du verkligen behöver göra, särskilt om du bara använder JavaScript för att göra Ajax-förfrågan, är en intern proxy som tar din fråga och skickar den vidare till den fjärrservern.
Först i din JavaScript, gör ett Ajax-anrop till din egen server, något som detta:
$.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);
}
});
Skapa sedan en enkel PHP-fil som heter proxy.php för att kapsla in dina POST-data och bifoga dem till den fjärranslutna URL-servern som parametrar. Jag ger dig ett exempel på hur jag kringgår detta problem med Expedia Hotel-söknings-API:
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));
}
Genom att göra:
echo json_encode(file_get_contents($url));
Du gör bara samma fråga men på serversidan och efter det borde det fungera bra.
Svar #5
Du behöver lägga till detta i början av din PHP-sida "login.php"
<?php header('Access-Control-Allow-Origin: *'); ?>
