2012-06-04 16 views
70

Tôi bị kẹt với vấn đề CORS này, mặc dù tôi đặt máy chủ (nginx/node.js) với các tiêu đề thích hợp.CORS chết người khi http: // localhost là nguồn gốc

tôi có thể nhìn thấy trong cửa sổ Mạng Chrome -> Tiêu đề phản hồi:

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

mà nên làm các trick.

Dưới đây là đoạn code mà bây giờ tôi sử dụng để kiểm tra:

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

tôi nhận được

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

tôi nghi ngờ đó là một vấn đề trong kịch bản client và không cấu hình máy chủ ...

+17

Không, stackoverflow.com cần phải thiết lập tiêu đề này, không phải bạn. : x. Điều gì sẽ là điểm của chính sách gốc tương tự nếu không. – Esailija

+2

Thử truy cập vào máy chủ mà bạn đã thiết lập không tràn ngăn xếp. ;) – Nek

+0

DOH! Có cách nào để nói với chrome (hoặc trình duyệt khác), để có được tài nguyên ngay cả khi tiêu đề bị thiếu khi nguồn gốc của tôi là localhost? – whadar

Trả lời

117

Chrome does not support localhost for CORS requests (lỗi mở từ năm 2010).

Để giải quyết vấn đề này, bạn có thể sử dụng tên miền như lvh.me (điểm 127.0.0.1 giống như localhost) hoặc bắt đầu chrome với cờ --disable-web-security (giả sử bạn chỉ đang thử nghiệm).

+0

Điều này không đúng. Tôi có thể đăng lên localhost với chrome – greensuisse

+10

@greensuisse - nó không được đăng lên localhost. Đó là đăng * từ * localhost đó là vấn đề. – Cheeso

+1

Lỗi đó không hợp lệ (và đã được đánh dấu là - http://crbug.com/67743#c17). [Nhận xét của Esailija] (http://stackoverflow.com/questions/10883211/deadly-cors-when-http-localhost-is-the-origin#comment14184025_10883211) là chính xác, việc thêm các tiêu đề này vào máy chủ cục bộ sẽ không cho phép bạn truy cập vào tất cả các trang web khác. Đó là trang web từ xa cần được phân phối với các tiêu đề này. –

15

Vấn đề thực sự là nếu chúng tôi đặt -Allow- cho tất cả yêu cầu (OPTIONS & POST), Chrome sẽ hủy nó. Các mã sau đây làm việc cho tôi với POST để localhost với 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

OP đang sử dụng nginx/node.js. Không phải PHP –

4

mỗi @ câu trả lời Beau của, Chrome không hỗ trợ CORS localhost yêu cầu, và ít có khả năng có sự thay đổi theo hướng này.

Tôi sử dụng số Allow-Control-Allow-Origin: * Chrome Extension để khắc phục sự cố này. Tiện ích mở rộng sẽ thêm Tiêu đề HTTP cần thiết cho 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.

Lưu ý rằng bộ lọc mở rộng tất cả các URL theo mặc định. Điều này có thể phá vỡ một số trang web (ví dụ: Dropbox). Tôi đã thay đổi nó để lọc chỉ localhost URL với bộ lọc URL sau

*://localhost:*/*