Вопрос по javascript, html5 – Смертельный CORS, когда http: // localhost является источником

108

Я застрял с этой проблемой CORS, хотя я установил сервер (nginx / node.js) с соответствующими заголовками.

Я вижу на панели Chrome Network - & gt; Заголовки ответа:

Access-Control-Allow-Origin:http://localhost

который должен сделать свое дело.

Вот код, который я сейчас использую для тестирования:

var xhr = new XMLHttpRequest();
xhr.onload = function() {
   console.log('xhr loaded');
};
xhr.open('GET', 'http://stackoverflow.com/');
xhr.send();

я получил

XMLHttpRequest cannot load http://stackoverflow.com/. Origin http://localhost is not allowed by Access-Control-Allow-Origin.

Я подозреваю, что это проблема в клиентском скрипте, а не в конфигурации сервера ...

Запускаю свои коды в Chrome (20.0.1132.57, Windows 7), работает отлично. imwilsonxu
Попробуйте получить доступ к серверу, который вы настроили, а не переполнение стека. ;) Nek
Нет, stackoverflow.com должен устанавливать этот заголовок, а не вы. :Икс. В чем же смысл политики происхождения в противном случае. Esailija
Если вы используете localhost с портом, этот ответ сработал для меняserverfault.com/a/673551/238261. Nelu
DOH! Есть ли способ сказать Chrome (или другой браузер), чтобы получить ресурс, даже если заголовок отсутствует, когда мой источник является localhost? whadar

Ваш Ответ

3   ответа
16

Настоящая проблема в том, что если мы установим-Allow- для всего запроса (OPTIONS & Амп;POST), Chrome отменит его. Следующий код работает для меня сPOST в LocalHost с Chrome

<?php
if (isset($_SERVER['HTTP_ORIGIN'])) {
    //header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
    header("Access-Control-Allow-Origin: *");
    header('Access-Control-Allow-Credentials: true');    
    header("Access-Control-Allow-Methods: GET, POST, OPTIONS"); 
}   
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
    if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']))
        header("Access-Control-Allow-Methods: GET, POST, OPTIONS");         
    if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']))
        header("Access-Control-Allow-Headers:{$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}");

    exit(0);
} 
?>
Error: User Rate Limit Exceeded
160

Хромне поддерживает localhost для запросов CORS (открытая ошибка с 2010 года).

Чтобы обойти это, вы можете использовать домен, какlvh.me (который указывает на 127.0.0.1, как localhost) или запустить Chrome с--disable-web-security флаг (при условии, что вы просто тестируете).

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededGrrrr...
Error: User Rate Limit Exceededcrbug.com/67743#c17). Esailija's commentError: User Rate Limit Exceeded
Error: User Rate Limit ExceededfromError: User Rate Limit Exceeded
27

Согласно ответу @ Beau, Chrome не поддерживает локальные CORS-запросы, и вряд ли что-то изменится в этом направлении.

Я используюAllow-Control-Allow-Origin: * Расширение Chrome обойти эту проблему. Расширение добавит необходимые заголовки HTTP для CORS:

Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: "GET, PUT, POST, DELETE, HEAD, OPTIONS"
Access-Control-Expose-Headers: <you can add values here>

исходный код опубликован на Github.

Обратите внимание, что расширение фильтрует все URL по умолчанию. Это может привести к поломке некоторых веб-сайтов (например, Dropbox). Я изменил его только для фильтрацииlocalhost URL со следующим фильтром URL

*://localhost:*/*
Error: User Rate Limit Exceeded

Похожие вопросы