Firefox 'Yêu cầu đa nguồn bị chặn' mặc dù có tiêu đề


119

Tôi đang cố gắng thực hiện một yêu cầu đa nguồn đơn giản và Firefox liên tục chặn nó với lỗi này:

Yêu cầu nguồn gốc chéo bị chặn: Chính sách nguồn gốc giống nhau không cho phép đọc tài nguyên từ xa tại [url]. Điều này có thể được khắc phục bằng cách di chuyển tài nguyên sang cùng một miền hoặc bật CORS. [url]

Nó hoạt động tốt trong Chrome và Safari.

Theo như tôi có thể nói, tôi đã đặt tất cả các tiêu đề chính xác trên PHP của mình để cho phép điều này hoạt động. Đây là những gì máy chủ của tôi đang phản hồi

HTTP/1.1 200 OK
Date: Mon, 23 Jun 2014 17:15:20 GMT
Server: Apache/2.2.22 (Debian)
X-Powered-By: PHP/5.4.4-14+deb7u8
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, OPTIONS
Access-Control-Allow-Headers: Content-Type
Access-Control-Request-Headers: X-Requested-With, accept, content-type
Vary: Accept-Encoding
Content-Length: 186
Content-Type: text/html

Tôi đã thử sử dụng Angular, jQuery và một đối tượng XMLHTTPRequest cơ bản, như sau:

var data = "id=1234"
var request = new XMLHttpRequest({mozSystem: true})
request.onload = onSuccess;
request.open('GET', 'https://myurl.com' + '?' + data, true)
request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
request.send()

... và nó hoạt động trên mọi trình duyệt ngoại trừ Firefox. Bất cứ ai có thể giúp đỡ với điều này?


Bạn có thể cung cấp dấu vết đầy đủ của tất cả các yêu cầu và phản hồi không? Hoặc cung cấp một trang web thử nghiệm ít nhất? Nếu trang web truy cập nguồn gốc từ xa http, https, tệp? mozSystemkhông được hỗ trợ cho các trang web thông thường chỉ là ứng dụng firefox-os được đóng gói , vì vậy hãy bỏ tùy chọn đó.
nmaier

1
Headers @nmaier khi gửi như POST hơn là GET: Accept application/json, text/plain, */* Accept-Encoding gzip, deflate Accept-Language en-US,en;q=0.5 Content-Length 35 Content-Type application/x-www-form-urlencoded; charset=UTF-8 Host [url] Origin [url] Referer [referrer url] User-Agent Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:30.0) Gecko/20100101 Firefox/30.0 Lỗi: Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at [url]. This can be fixed by moving the resource to the same domain or enabling CORS. [url]
Godwhacker

2
@nmaier Trên thực tế, có vẻ như đây là một số vấn đề với chứng chỉ bảo mật trên trang web tôi đang truy cập- Firefox chỉ đưa ra một lỗi giả. Nếu tôi thêm trang web vào danh sách ngoại lệ, nó hoạt động tốt.
Godwhacker

Câu trả lời:


121

Hóa ra điều này không liên quan gì đến CORS- đó là vấn đề với chứng chỉ bảo mật. Các lỗi đánh lạc hướng = 4 giờ đau đầu.


3
Chỉ có vấn đề chính xác này, lỗi quá chung chung và trên hết là Chrome và Firefox sử dụng các kho lưu trữ chứng chỉ khác nhau, vì vậy khó gỡ lỗi hơn. Tôi nên nghi ngờ điều đó khi proxy của tôi không nắm bắt bất kỳ yêu cầu TÙY CHỌN nào (nó đã bị lỗi khi bắt tay SSL).
Daniel Correia

4
Godwhacker, có lẽ tôi cũng đang gặp phải vấn đề tương tự. Làm thế nào bạn phát hiện ra rằng đó là chứng chỉ bảo mật? Bạn có thể thấy cái này ở đâu?
Leo

9
Trong trường hợp của tôi, tôi có một ứng dụng góc cạnh thực hiện cuộc gọi đến một máy chủ khác, cả hai đều sử dụng chứng chỉ được ký nội bộ. Tuy nhiên, Firefox không tự động tin tưởng chứng chỉ vì nó không được cơ quan công quyền công nhận. Vì vậy, tôi cần đảm bảo rằng các chứng chỉ cho cả hai máy chủ đã được thêm vào làm ngoại lệ trong Firefox trước khi vấn đề này biến mất.
Sam Storie

3
Đối với tôi, cách khắc phục là đặt withCredentials=truetrên phiên bản XHR; nếu không thì Firefox không thể sử dụng chứng chỉ ứng dụng khách khi thực hiện yêu cầu (tuy nhiên, hoạt động tốt trong Chrome).
Clint Harris

1
Nhận xét của @SamStorie nghe giống câu trả lời hơn câu trả lời này. Cảm ơn bạn
Naga

26

Tôi thấy rằng vấn đề của mình là máy chủ mà tôi đã gửi yêu cầu chéo có chứng chỉ không đáng tin cậy.

Nếu bạn muốn kết nối với một miền chéo với https , trước tiên bạn phải thêm một ngoại lệ cho chứng chỉ này.

Bạn có thể thực hiện việc này bằng cách truy cập liên kết bị chặn một lần và thêm ngoại lệ.


5
Điều đó không đặc biệt giúp ích cho bất kỳ ai truy cập trang web của bạn, trừ khi bạn hài lòng đặt một thông báo trên đó rằng 'Nếu bạn đang sử dụng Firefox, vui lòng truy cập trang web này và thêm nó vào danh sách các trường hợp ngoại lệ của bạn'
Godwhacker

@ Cracker0dks "truy cập liên kết bị chặn một lần và thêm ngoại lệ", bạn có thể giải thích thêm về nơi để thêm ngoại lệ không? Tôi đang sử dụng Firefox Quantum. TIA
Paul

1
bạn lướt đến liên kết firefox đang phàn nàn về điều này. Sau đó, bạn nhận được cảnh báo chứng chỉ. Cho phép chứng chỉ. Truy cập lại trang web chính của bạn.
Cracker0dks

26

Tôi đã gặp câu hỏi này khi phát hiện thấy các yêu cầu trong Firefox bị chặn với thông báo:

Lý do: Yêu cầu CORS không thành công

Sau khi vén tóc, tôi phát hiện ra rằng một tiện ích mở rộng Firefox mới được cài đặt, Privacy Badger, đang chặn các yêu cầu.

Nếu bạn nghĩ đến câu hỏi này sau khi vò đầu bứt tai, hãy thử kiểm tra xem bạn đã cài đặt những tiện ích mở rộng nào để xem có tiện ích nào chặn yêu cầu không.

Xem Lý do: Yêu cầu CORS không thành công trên MDN để biết chi tiết.


làm thế nào bạn tìm ra tiện ích mở rộng nào đang chặn các yêu cầu? Tôi gặp cùng một vấn đề, như yêu cầu thành công trong một Firefox với một hồ sơ mới (vì vậy không mở rộng)
Ciprian Tomoiagă

1
Tôi đã nhấp vào từng tiện ích mở rộng để xem liệu có bất kỳ đề cập nào về việc chặn nội dung cho trang web cụ thể mà tôi đang gặp sự cố hay không. Ghostery có một mục nhập nên tôi đã đánh dấu trang web là đáng tin cậy, tải lại trang và các yêu cầu đã thành công.
Giáo sư lập trình

1
Cảm ơn bạn! Tôi cũng đã khám phá ra Project Insight tiện ích mở rộng cung cấp cái nhìn tổng quan về tất cả các quyền của tiện ích mở rộng. addons.mozilla.org/en-US/firefox/addon/project-insight
Ciprian Tomoiagă

1
@awendt Oof. Riêng tư Badger cho tôi cũng vậy. Cảm ơn.
Jason Leach


12

Nếu bạn không có chứng chỉ 'thực' (và do đó sử dụng chứng chỉ tự ký), trong FireFox, bạn có thể truy cập:

Options > Privacy & Security > (scroll to the bottom) View Certificates > Add Exception.

Tại đó, hãy điền vào vị trí, ví dụ: https: //wwww.myserver: myport


điều này có hiệu quả với tôi khi CORS của tôi hoạt động trong tất cả các trình duyệt khác ngoại trừ Firefox bị lỗi -> Yêu cầu chéo nguồn gốc bị chặn: Chính sách nguồn gốc giống nhau không cho phép đọc tài nguyên từ xa tại localhost: 44304 / v1 / search . (Lý do: Yêu cầu CORS không thành công).
JGilmartin

5

Chỉ là một lời cảnh báo. Cuối cùng tôi đã giải quyết được vấn đề với Firefox và CORS.

Giải pháp cho tôi là bài đăng này

Đặt CORS (chia sẻ tài nguyên nguồn gốc chéo) trên Apache với tiêu đề phản hồi chính xác cho phép mọi thứ thông qua | Benjamin Horn

Tuy nhiên, Firefox đã hoạt động thực sự, thực sự kỳ lạ sau khi đặt các tiêu đề đó trên máy chủ Apache (trong thư mục .htaccess).

Tôi đã thêm rất nhiều console.log("Hi FF, you are here A")vv để xem những gì đang xảy ra.

Lúc đầu, nó trông giống như nó bị treo cổ xhr.send(). Nhưng sau đó tôi phát hiện ra nó không đi đến tuyên bố này. Tôi đã đặt một cái khác console.logngay trước nó và không đạt được điều đó - mặc dù không có gì giữa cái cuối cùng console.logvà cái mới. Nó chỉ dừng lại giữa hai console.log.

Sắp xếp lại các dòng, xóa, xem có ký tự lạ nào trong tệp không. Tôi không tìm thấy gì cả.

Khởi động lại Firefox đã khắc phục sự cố.

Có, tôi nên gửi một lỗi. Chỉ là nó quá xa lạ nên không biết sao chép lại.

THÔNG BÁO : Và, ồ, tôi chỉ làm các Header always setphần, không phải Rewrite*một phần!


Về cơ bản, cùng một câu chuyện đối với tôi ngày hôm nay. Khởi động lại Firefox đã sửa nó. Hơn 5 năm sau.
Søren Mortensen

3

Chỉ cần thêm

<IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "*"
</IfModule>

vào .htaccesstệp trong thư mục gốc của trang web mà bạn đang cố gắng kết nối.


Điều đó tốt nếu bạn muốn đặt nó để chấp nhận yêu cầu từ bất kỳ đâu; không tốt nếu bạn không, đó là toàn bộ điểm của tiêu đề.
Godwhacker

2

Đối với hậu thế, cũng kiểm tra nhật ký máy chủ để xem liệu tài nguyên đang được yêu cầu có trả về 200 hay không.

Tôi gặp phải sự cố tương tự, trong đó tất cả các tiêu đề phù hợp đang được trả lại trong yêu cầu ajax trước chuyến bay, nhưng trình duyệt báo cáo yêu cầu thực tế đã bị chặn do tiêu đề CORS không hợp lệ.

Hóa ra, trang được yêu cầu trả về lỗi 500 do mã không hợp lệ, nhưng chỉ khi nó được tìm nạp qua CORS. Trình duyệt (cả Chrome và Firefox) đã báo cáo nhầm rằng thiếu tiêu đề Access-Control-Allow-Origin thay vì cho biết trang trả về 500.


1

Hãy thử điều này, nó sẽ giải quyết vấn đề của bạn

  1. Trong config.php của bạn, thêm www vào trước domain.com của bạn. Ví dụ:

    HTTP define('HTTP_SERVER', 'http://domain name with www/');
    HTTPS define('HTTPS_SERVER', 'http://domain name with www/');
  2. Thêm cái này vào tệp .htaccess của bạn

    RewriteCond %{REQUEST_METHOD} OPTIONS RewriteRule ^(.*)$ $1 [R=200,L]

1

Đối với tôi, hóa ra tôi đã đặt Access-Control-Allow-Origintiêu đề phản hồi thành một tiêu đề cụ thể (và chính xác) host.comnhưng thay vào đó, nó phải được trả lại http://host.com. Firefox làm gì? Nó âm thầm nuốt yêu cầu GET và trả về trạng thái 0 cho XHR, không có cảnh báo nào xuất ra bảng điều khiển javascript, trong khi đối với các lỗi tương tự khác, ít nhất nó sẽ nói gì đó. Ai ai.


1
Có vẻ như kế hoạch được mong đợi, hãy xem các ví dụ tại w3.org/TR/cors nhưng dù sao cũng cảm ơn, tôi cũng đã làm sai và vâng, thông báo lỗi của Firefox đang thiếu.
Richard Green

1

Để gỡ lỗi, hãy kiểm tra nhật ký máy chủ nếu có thể. Firefox trả về lỗi CORS trong bảng điều khiển vì nhiều lý do.

Một trong những lý do cũng là plugin uMatrix (và tôi đoán là NoScript và tương tự).


0

Tôi đã đối mặt với vấn đề tương tự và tôi nghĩ là hợp lệ để được đăng ký cách tôi đã khắc phục nó:

Tôi có một hệ thống được xây dựng cơ bản dựa trên Symfony 3. Vì mục đích tự học và hiệu suất, tôi đã quyết định viết một vài tập lệnh bằng cách sử dụng GoLang, một API có quyền truy cập công khai.

API Go của tôi mong đợi các tham số định dạng Json và cũng trả về phản hồi định dạng Json

Để gọi những GoApi đó mà tôi đang sử dụng, hầu hết, $ .ajax (jQuery) Thử nghiệm đầu tiên là một sự lừa dối: cửa sổ bật lên nổi tiếng "Cross-Origin Request Blocked" (không có) bật lên! Sau đó, tôi đã cố gắng đặt "Access-Control-Allow-Origin: *" trên apache conf, htaccess, php, javascript và bất kỳ nơi nào tôi có thể tìm thấy trên google!

Nhưng, thậm chí, cùng một lỗi khó chịu !!!

Giải pháp rất đơn giản: Tôi phải thực hiện các yêu cầu "ĐĂNG" thay vì "NHẬN".

Để đạt được điều đó, tôi phải điều chỉnh cả hai, GoLang và JavaScript để sử dụng GET! Sau khi hoàn tất, tôi sẽ không còn yêu cầu Cross-Origin nào nữa !!!

Hy vọng nó giúp

Tái bút:

Tôi đang sử dụng apache và Vhost, trên Khối thư mục tôi có

  Header always set Access-Control-Allow-Origin "*"
  Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS, DELETE, PUT"

Hãy nhớ: "*" có nghĩa là bạn sẽ chấp nhận yêu cầu từ bất kỳ ai !!! (Có thể là thiếu bảo mật) Trong trường hợp của tôi thì không sao, vì nó sẽ là một API công khai

PS2: Tiêu đề của tôi

Tiêu đề phản hồi

Access-Control-Allow-Credentials    true
Access-Control-Allow-Headers    Authorization
Access-Control-Allow-Methods    GET, POST, PUT
Access-Control-Allow-Origin http://localhost
Content-Length  164
Content-Type    application/json; charset=UTF-8
Date    Tue, 07 May 2019 20:33:52 GMT

Tiêu đề yêu cầu (469 B)

Accept  application/json, text/javascript, */*; q=0.01
Accept-Encoding gzip, deflate
Accept-Language en-US,en;q=0.5
Connection  keep-alive
Content-Length  81
Content-Type    application/x-www-form-urlencoded; charset=UTF-8
Host    localhost:9003
Origin  http://localhost
Referer http://localhost/fibootkt/MY_app_dev.php/MyTest/GoAPI
User-Agent  Mozilla/5.0 (Macintosh; Intel …) Gecko/20100101 Firefox/66.0

0

Nếu các câu trả lời nói trên không giúp ích được gì thì hãy kiểm tra xem máy chủ phụ trợ có đang hoạt động hay không như trong trường hợp của tôi là máy chủ bị lỗi và lỗi này hoàn toàn gây nhầm lẫn.


0

Trong trường hợp của tôi, đó là ADBLOCKER của tôi ! Vì một số lý do, nó đã được bật trên localhost của tôi và gây ra lỗi này trong Firefox.

Vô hiệu hóa nó hoặc gỡ bỏ cài đặt các Plugin nên sửa lỗi này.

Trong trường hợp của bạn, nó có thể không phải là trình chặn quảng cáo mà là một plugin khác của Firefox. Trước tiên, hãy kiểm tra nó ở chế độ ẩn danh mà không có plugin nào để xác định xem đó có phải là vấn đề hay không và sau đó vô hiệu hóa các plugin một cách có hệ thống cho đến khi bạn tìm ra thủ phạm.


-3

Các tập tin là tự giải thích. Tạo một tập tin, gọi nó là bất cứ thứ gì. Trong trường hợp của tôi jq2.php.

<html>
<head>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script>
    // document is made ready so that the program starts when we load this page       
    $(document).ready(function(){

        // it tells that any key activity in the "subcat_search" filed will execute the query.
        $("#subcat_search").keyup(function(){

            // we assemble the get link for the direction to our engine "gs.php". 
            var link1 = "http://127.0.0.1/jqm/gs.php?needle=" + $("#subcat_search").val();

            $.ajax({
                url: link1,
                // ajax function is called sending the input string to "gs.php".
                success: function(result){
                    // result is stuffed in the label.
                    $("#search_val").html(result);
                }
            });
        })   

    });
</script>
</head>

<body>

<!-- the input field for search string -->
<input type="text" id="subcat_search">
<br>
<!-- the output field for stuffing the output. -->
<label id="search_val"></label>

</body>
</html>

Bây giờ chúng ta sẽ bao gồm một engine, tạo một tệp, gọi nó là bất cứ thứ gì bạn thích. Trong trường hợp của tôi, nó là gs.php.

$head = "https://maps.googleapis.com/maps/api/place/textsearch/json?query="; //our head
$key = "your key here"; //your key
$hay = $_GET['needle'];

$hay = str_replace(" ", "+", $hay); //replacing the " " with "+" to design it as per the google's requirement 
$kill = $head . $hay . "&key=" . $key; //assembling the string in proper way . 
print file_get_contents($kill);

Tôi đã cố gắng giữ cho ví dụ đơn giản nhất có thể. Và bởi vì nó thực thi liên kết trên mỗi lần nhấn phím, hạn ngạch API của bạn sẽ được tiêu thụ khá nhanh.

Tất nhiên không có kết thúc cho những việc chúng ta có thể làm, như đưa dữ liệu vào bảng, gửi đến cơ sở dữ liệu, v.v.


Vui lòng không đăng cùng một câu trả lời nhiều hơn một lần. Và hãy chắc chắn rằng câu trả lời của bạn thực sự trả lời câu hỏi. Nếu bạn cần hướng dẫn ai đó ở nơi khác để biết thêm thông tin, đó không phải là một câu trả lời hay.
elixenide

Xin chào Tôi đã sử dụng liên kết vì nó có thêm một số thông tin như điều kiện tiên quyết, v.v. Nếu bạn cảm thấy nó phù hợp, tôi sẽ xóa nó.
Harsh Mehta
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.