2015-01-18 16 views
5

Tôi đang cố tải dữ liệu vào hộp thoại jQuery qua ajax nhưng yêu cầu không thành công trong Firefox (34.0.5). Hoạt động tốt và tôi không nhận được khiếu nại nào trong Chrome và Safari.CORS không hoạt động trong Firefox

conf apache của tôi chứa:

Header set Access-Control-Allow-Origin "*" 
Header set Access-Control-Allow-Methods: "PUT, GET, POST, DELETE, OPTIONS" 
Header set Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept" 

Các jQuery chỉ đơn giản là:

$('#dialog').load('example.php', function() { $('#dialog').dialog('open'); }); 

Firefox đáp ứng với giao diện điều khiển báo lỗi sau:

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://www.example.com/example.php. This can be fixed by moving the resource to the same domain or enabling CORS.

Kiểm tra các tiêu đề phản hồi từ yêu cầu ajax tất cả dường như là nguyên vẹn thứ hai nội tuyến với những gì được khai báo trong apache. Tôi có nên bao gồm một số chỉ thị khác hoặc thay đổi cấu hình theo cách nào đó để làm việc này không?

CẬP NHẬT: Ở gốc của sự cố là tôi muốn cả hai example.comwww.example.com hoạt động giống nhau. Trang web được đề cập luôn có thẻ trong tiêu đề <base href="www.example.com" /> trong cả hai trường hợp vì đây là một phần của khung trang web mặc định. Tôi đã phát hiện ra rằng việc loại bỏ liên kết này cho phép yêu cầu ajax hoạt động trên example.com, ngay cả khi nó vẫn gọi cụ thể một tài nguyên từ tên miền phụ www.

Điều thú vị là nhiều khía cạnh của yêu cầu và tiêu đề phản hồi thay đổi khi thẻ này bị xóa. Đối với bất cứ ai có thể có một đầu mối về các tác động ở đây tôi dán cả hai tiêu đề yêu cầu và phản hồi bên dưới.

Dưới đây là các tiêu đề đã xóa thẻ <base>. Trong trường hợp này gọi ajax đã thành công:

ỨNG PHÓ

HTTP/1.1 200 OK 
    Date: Sun, 18 Jan 2015 22:11:04 GMT 
    Server: Apache/2.4.7 (Ubuntu) 
    X-Powered-By: PHP/5.5.9-1ubuntu4.5 
    Set-Cookie: PHPSESSID=xxx; path=/; HttpOnly 
    language=en; expires=Tue, 17-Feb-2015 22:11:04 GMT; Max-Age=2592000; path=/; domain=www.example.com 
    currency=CAD; expires=Tue, 17-Feb-2015 22:11:04 GMT; Max-Age=2592000; path=/; domain=www.example.com 
    Expires: Thu, 19 Nov 1981 08:52:00 GMT 
    Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0, public 
    Pragma: no-cache 
    Content-Encoding: gzip 
    access-control-allow-methods: PUT, GET, POST, DELETE, OPTIONS 
    access-control-allow-origin: * 
    access-control-allow-headers: Origin, X-Requested-With, Content-Type, Accept 
    Content-Length: 1515 
    Connection: close 
    Content-Type: text/html; charset=utf-8 

YÊU CẦU

GET /example.php HTTP/1.1 
    Host: www.example.com 
    User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:34.0) Gecko/20100101 Firefox/34.0 FirePHP/0.7.4 
    Accept: text/html, */*; q=0.01 
    Accept-Language: en-US,en;q=0.5 
    Accept-Encoding: gzip, deflate 
    Referer: http://example.com/ 
    Origin: http://example.com 
    x-insight: activate 
    Connection: keep-alive 
    Cache-Control: max-age=0 

Và đây là các tiêu đề với <base> thẻ còn nguyên vẹn. Những tiêu đề này phản ánh tình huống mà cuộc gọi ajax bị lỗi. Nó đáng chú ý là lĩnh vực 'Địa điểm' trong tiêu đề phản ứng nói 'https' mặc dù điều này đã không xảy ra qua một kết nối https:

ỨNG PHÓ

HTTP/1.1 302 Found 
    Date: Sun, 18 Jan 2015 22:12:26 GMT 
    Server: Apache/2.4.7 (Ubuntu) 
    X-Powered-By: PHP/5.5.9-1ubuntu4.5 
    Set-Cookie: PHPSESSID=xxx; path=/; HttpOnly 
    language=en; expires=Tue, 17-Feb-2015 22:12:26 GMT; Max-Age=2592000; path=/; domain=www.example.com 
    currency=CAD; expires=Tue, 17-Feb-2015 22:12:26 GMT; Max-Age=2592000; path=/; domain=www.example.com 
    Expires: Thu, 19 Nov 1981 08:52:00 GMT 
    Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0, public 
    Pragma: no-cache 
    Status: 302 
    Location: https://www.example.com/index.php 
    access-control-allow-methods: PUT, GET, POST, DELETE, OPTIONS 
    access-control-allow-origin: * 
    access-control-allow-headers: Origin, X-Requested-With, Content-Type, Accept 
    Content-Length: 0 
    Connection: close 
    Content-Type: text/html 

YÊU CẦU

OPTIONS /example.php HTTP/1.1 
    Host: www.example.com 
    User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:34.0) Gecko/20100101 Firefox/34.0 FirePHP/0.7.4 
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
    Accept-Language: en-US,en;q=0.5 
    Accept-Encoding: gzip, deflate 
    Origin: http://example.com 
    Access-Control-Request-Method: GET 
    Access-Control-Request-Headers: x-requested-with 
    x-insight: activate 
    Connection: keep-alive 
    Cache-Control: max-age=0 
+0

Các tiêu đề CORS có được gửi hai lần không? Tôi đã có một vấn đề gần đây, nơi tôi đã nhầm lẫn thêm nó vào htaccess của tôi cũng như conf apache của tôi. Điều này khiến các giá trị tiêu đề được gửi hai lần khiến một số trình duyệt không hoạt động chính xác. – JohnP

+0

Không phải là tôi có thể nhìn thấy. Tôi không có bất cứ điều gì thiết lập .htaccess chỉ apache vhost conf - mặc dù nghĩ rằng nó cũng có thể xảy ra nếu bạn sử dụng 'Header add' thay vì' Header set'. Vì nó đứng tôi chỉ nhìn thấy chúng một lần trong các tiêu đề phản ứng. – billynoah

+0

Tôi đang gặp sự cố tương tự (hoạt động trên Chrome, không phải trong FF) nhưng không sử dụng thẻ . – aesede

Trả lời

0

Theo MDN, bạn không thể sử dụng ký tự đại diện cho "yêu cầu được chứng nhận", vì vậy có thể yêu cầu của bạn nằm trong danh mục đó.

Các vấn đề liên quan