2012-06-04 2 views
70

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

я могу видеть в Chrome Network панели -> Response Headers:

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. 

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

+17

Нет, stackoverflow.com нужно установить этот заголовок, а не вы. :Икс. В противном случае было бы политикой того же происхождения. – Esailija

+2

Попробуйте получить доступ к серверу, на котором вы настроили переполнение стека. ;) – Nek

+0

DOH! Есть ли способ сказать хром (или другой браузер), чтобы получить ресурс, даже если заголовок отсутствует, когда мое происхождение является localhost? – whadar

ответ

117

Chrome does not support localhost for CORS requests (открытая ошибка с 2010 года).

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

+0

Неверное изображение. Я могу публиковать на localhost с chrome – greensuisse

+10

@greensuisse - это не сообщение на localhost. Это сообщение * из * localhost, что является проблемой. – Cheeso

+1

Эта ошибка недействительна (и была отмечена как таковая - http://crbug.com/67743#c17). [Комментарий Esailija] (http://stackoverflow.com/questions/10883211/deadly-cors-when-http-localhost-is-the-origin#comment14184025_10883211) верен, добавление этих заголовков в localhost не даст вам магического доступа все остальные сайты. Это удаленный сайт, который необходимо обслуживать с этими заголовками. –

15

Настоящая проблема заключается в том, что если мы установим -Allow- для всех запросов (ОПЦИИ & 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); 
} 
?> 
+2

ОП использует nginx/node.js. Не PHP –

4

Per @ ответ Бо, в Chrome не поддерживает LOCALHOST CORS запросы, и вряд ли какие-либо изменения в этом направлении.

Я использую Allow-Control-Allow-Origin: * Chrome Extension, чтобы обойти эту проблему. Расширение добавит необходимые заголовки 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> 

source code is published on Github.

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

*://localhost:*/* 
Смежные вопросы