2016-07-20 5 views
-1

Я знаю, что есть несколько сообщений по этой теме, но я немного смущен, почему я получаю запрос «Перекрестный запрос»: одна и та же политика происхождения запрещает чтение удаленного ресурса по адресу http://ipaddress/json. Это можно устранить, перемещая ресурс в тот же домен или разрешая CORS. " Существует API доступа, к которому я пытаюсь получить доступ, который в настоящее время находится на устройстве с IP-адресом xyz. Этот Rest API - это сценарий CGI, который я разработал в C.Смутно, почему я получаю запрос на перекрестный запрос Заблокированная ошибка

Прямо сейчас мое устройство, в котором я запускаю этот код, также подключено к тому же Wi-Fi, с IP-адресом xyz. Не означает ли это, что ресурс не является удаленным, поскольку он находится в одном домене?

Это мой код JavaScript, если кому-то интересно.

<button id="submit" onclick="fun()">Click here!</button> 

<script language="JavaScript" type="text/javascript" src="jquery-3.1.0.min.js"></script> 
<script> 
function fun() 
{ 
    $.getJSON('http://ipaddress/json', function(data) 
{ 
    alert(data.toSource()); 
    console.log(data); 
}); 
} 
</script> 

Я не обязательно просить решения этого вопроса, так как я знаю, что есть много онлайн, но я более любопытно, почему я получаю эту проблему, и где я был не прав с моим пониманием этой ошибки. Я также попытался экспериментировать с несколькими другими публичными сайтами JSON:

Использование https://api.github.com/users/mralexgray/repos не привело к этой ошибке и вернула правильную информацию.

Однако использование https://puppygifs.tumblr.com/api/read/json привело к этой ошибке. Я предполагаю, что это может быть потому, что GitHub добавил CROS на свой сервер?

Любое понимание будет оценено по достоинству.

+0

Вы можете тривиально проверить это самостоятельно. используйте что-то вроде httpfox в firefox для просмотра запросов из вашего браузера на указанный сайт и посмотрите, как выглядит ответ запроса «OPTIONS» (если есть) при попытке вызова ajax. –

+0

Когда спецификация CORS говорит «тот же домен», это означает, что все имя после '//' должно быть таким же, как и исходное. Нахождение в одной сети или наличие того же суффикса домена недостаточно хороши. 'foo.domain.com' и' bar.domain.com' - это не тот же домен, что и '192.168.2.10' и' 192.168.2.20'. – Barmar

+0

Если у вас есть кабельный модем, ваш общедоступный IP-адрес и IP-адрес вашего соседа, вероятно, будут такими же, за исключением последних двух цифр. Вы действительно считаете, что они находятся в одном домене только потому, что они используют одну и ту же кабельную компанию? – Barmar

ответ

1

Для того же происхождения URL должен иметь один и тот же протокол (например, «http»), тот же порт и тот же домен. Если вы используете прямой IP-адрес в URL вместо домена, он должен иметь тот же IP-адрес.

Не имеет значения, что вы находитесь на том же WiFi или в той же локальной сети. Все, что имеет значение, - это источник URL-адреса веб-страницы, в которой работает Javascript, по сравнению с источником URL-адреса, к которому вы обращаетесь.

Если вы являетесь одним и тем же источником, запросы будут работать без разрешения CORS на сервере.

Если вы не являетесь одним и тем же источником, сервер должен будет включить CORS до того, как браузер позволит выполнить вызов Ajax.

Если вы видите конкретные вызовы ajax для перекрестного происхождения, которые работают, то эти целевые серверы должны иметь CORS.


Итог: Если вы пытаетесь получить доступ к своему собственному сценарию CGI с вызовом AJAX, и вы используете IP-адрес в URL и веб-страницу, что вызов Ajax делается из не также поступают с того же IP-адреса, тогда вам нужно добавить поддержку CORS в свой CGI-скрипт, чтобы браузер позволял сделать запрос.

Или переместите свой CGI на тот же IP-адрес, с которого связана веб-страница.

+0

Хорошо, это имеет смысл тогда. Да, два IP-адреса различаются, поэтому я перейду к добавлению CORS к моему сценарию CGI. Является ли добавление только CORS в свой CGI Script, или мне также нужно добавить поддержку CORS на веб-сервер, который я использую (NGINX). Кроме того, не уверен, что вы знаете ответ на этот вопрос, но добавляет поддержку CORS для CGI-скрипта на C так же просто, как 'printf (« Access-Control-Allow-Origin: * »);'? Спасибо за объяснение! – trynacode

+0

@trynacode - вам не нужна поддержка CORS на сервере, откуда приходит веб-страница, только на сервере, на который делается вызов Ajax. Там может быть немного больше, чем то, что вы предлагаете для поддержки CORS (это зависит от вашего вызова ajax). Есть тысячи статей по этой теме, чтобы вы могли найти правильное руководство с Google. В зависимости от вашего конкретного вызова Ajax вам также может потребоваться реализовать команду OPTIONS в дополнение к GET, поскольку браузер может предшествовать GET с помощью OPTIONS - в зависимости от конкретного вызова Ajax. – jfriend00

Смежные вопросы