Я использую .htaccess для перезаписи URL-адресов, и я использовал базовый тег html, чтобы он работал.
Теперь, когда я пытаюсь выполнить запрос ajax, я получаю следующую ошибку:
XMLHttpRequest не может загрузить http://www.wordicious.com/login.php. В запрошенном ресурсе нет заголовка "Access-Control-Allow-Origin". Origin 'http://wordicious.com', следовательно, не допускается.
Используйте addHeader
Вместо использования метода setHeader
,
response.addHeader("Access-Control-Allow-Origin", "*");
*
в приведенной выше строке позволит access to all domains
.
Для разрешения access to specific domain only
:
response.addHeader("Access-Control-Allow-Origin", "http://www.example.com");
Отметьте blog post
.
JavaScript-код ограничен политикой того же происхождения, то есть со страницы www.example.com
вы можете делать запросы (AJAX) только для служб, расположенных по адресу точно того же домена, в этом случае точно www.example.com
( не example.com
- без www
- или whatever.example.com
).
В вашем случае ваш код Ajax пытается найти службу в http://wordicious.com
со страницы, расположенной в http://www.wordicious.com
.
Хотя они очень похожи, они не того же домена. И когда они не находятся в одном домене, запрос будет успешным только в том случае, если целевой ответ содержит заголовок Access-Control-Allow-Origin
.
Поскольку ваша страница/служба в http://wordicious.com
никогда не была настроена для представления такого заголовка, отображается это сообщение об ошибке.
Как сказано, происхождение (где страница с JavaScript находится), а цель (где JavaScript пытается достичь) домены должна быть точной.
Ваше дело похоже на опечатку. Похож, что http://wordicious.com
и http://www.wordicious.com
- фактически тот же сервер/домен. Поэтому, чтобы исправить, введите цель и источник поровну: сделайте страницы/службы запроса кода Ajax на http://www.wordicious.com
not http://wordicious.com
. (Возможно, поместите целевой URL относительно, например '/login.php'
, без домена).
Если проблема не такая опечатка, как, кажется, один из этих вопросов, решение должно состоять в добавить Access-Control-Allow-Origin
в целевой домен. Чтобы добавить его, зависит, конечно, от сервера/языка, стоящего за этим адресом. Иногда переменная конфигурации в инструменте будет делать трюк. В других случаях вам придется добавлять заголовки через код самостоятельно.
Для сервера .NET это можно настроить в web.config, как показано ниже.
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="your_clientside_websiteurl" />
</customHeaders>
</httpProtocol>
</system.webServer>
Например, скажем, если домен сервера http://live.makemypublication.com, а клиент http://www.makemypublication.com затем настройте на сервере web.config ниже
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="http://www.makemypublication.com" />
</customHeaders>
</httpProtocol>
</system.webServer>
Если вы получите это сообщение об ошибке в браузере:
Нет заголовка "Access-Control-Allow-Origin" присутствует на запрошенном ресурсе. Поэтому Origin '...' не допускается.
когда вы пытаетесь выполнить запрос AJAX POST/GET удаленному серверу, который вышел из-под контроля, забудьте об этом простом исправлении:
<?php header('Access-Control-Allow-Origin: *'); ?>
Что вам действительно нужно делать, особенно если вы используете JavaScript для выполнения запроса Ajax, это внутренний прокси-сервер, который берет ваш запрос и отправляет его на удаленный сервер.
Сначала в вашем JavaScript выполните вызов Ajax на ваш собственный сервер, например:
$.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);
}
});
Затем создайте простой PHP файл с именем proxy.php, чтобы обернуть ваши данные POST и добавить их на удаленный URL-сервер в качестве параметров. Я приведу пример того, как я обойду эту проблему с API поиска 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));
}
Выполняя:
echo json_encode(file_get_contents($url));
Вы просто выполняете тот же запрос, но на стороне сервера, и после этого он должен работать нормально.
Вам нужно добавить это в начало вашей php-страницы "login.php"
<?php header('Access-Control-Allow-Origin: *'); ?>
вы должны поместить ключи/значения заголовков в ответ метода метода. например, если у вас есть ресурс в http://mydomain.com/myresource то в коде сервера вы пишете
//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");
}
}
В основном изменить ответ заголовка API, добавив следующие дополнительные параметры.
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: *
Но это нехорошее решение, когда речь заходит о безопасности
Обходной путь заключается в использовании обратного прокси-сервера, запущенного на вашем "исходном" хосте, и пересылки на ваш целевой сервер, например, Fiddler:
Ссылка здесь: http://docs.telerik.com/fiddler/configure-fiddler/tasks/usefiddlerasreverseproxy
Или прокси-сервер Apache Reverse...
Решено с помощью следующей записи в 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}]]
Добавьте это к вам файл PHP или главный контроллер
header("Access-Control-Allow-Origin: http://localhost:9000");
header("Access-Control-Allow-Credentials: true");
Я встречаю эту проблему, когда я использую Angular
для публикации записи на Django REST
backend. Иногда нет особых причин для этой проблемы. Проверьте сообщение об ошибке Django, вы найдете решение.
http://wordicious.com
- это домен, отличный отhttp://www.wordicious.com/
, поэтому ошибка Кстати, если он работает сейчас и вернулся сам, вы, вероятно, должны удалить вопрос.