Bộ tiêu đề Access-Control-Allow-Origin trong .htaccess không hoạt động


90

Tôi không thể tìm ra lý do tại sao .htaccesscài đặt tiêu đề của tôi không hoạt động.

Của tôi .htaccessNội dung tệp :

Header set Access-Control-Allow-Origin *
Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS, DELETE, PUT"
Header always set Access-Control-Allow-Headers "*"
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [QSA,L]

Nhưng khi tôi xóa Header's và thêm chúng vàoindex.php thì mọi thứ hoạt động tốt.

header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Methods: PUT, GET, POST, DELETE, OPTIONS");
header("Access-Control-Allow-Headers: *");

Tôi đang thiếu cái gì?

Câu trả lời:


134

Điều này sẽ hoạt động:

Header add Access-Control-Allow-Origin "*"
Header add Access-Control-Allow-Headers "origin, x-requested-with, content-type"
Header add Access-Control-Allow-Methods "PUT, GET, POST, DELETE, OPTIONS"

46
Đừng quên kích hoạt các tiêu đề mô-đun apachea2enmod headers
Lucas Serafim

1
Nó đã sửa: "Phương thức PUT không được phép bởi Access-Control-Allow-Method"
Rahul Prasad

6
Ngoài ra, tốt nhất bạn nên sử dụng Header settrong trường hợp này. Nếu mã được thay đổi và nó KHÔNG đặt tiêu đề, việc Apache thực hiện a header addsẽ gửi tiêu đề kép **. Điều này sẽ phá vỡ các khách hàng như Restangular chẳng hạn.
Julian

2
Đừng quên, nếu cần,Header add Access-Control-Allow-Credentials "true"
Marco Marsala

20

Chỉ đối với hồ sơ, tôi đã gặp phải cùng một vấn đề và không có câu trả lời nào có hiệu quả.

Tôi đã sử dụng công cụ kiểm tra tiêu đề: http://www.webconfs.com/http-header-check.php

Tôi đã thử nghiệm với IP của mình ( http://192.0.2.1/upload) và kết quả là như sau:

HTTP/1.1 301 Moved Permanently => 
Date => Sat, 10 Jan 2015 04:03:35 GMT
Server => Apache/2.2.21 (Win32) mod_ssl/2.2.21 OpenSSL/1.0.0e PHP/5.3.8 mod_perl/2.0.4 Perl/v5.10.1
Location => http://192.0.2.1/upload/
Content-Length => 380
Connection => close
Content-Type => text/html; charset=iso-8859-1

Đã có chuyển hướng xảy ra và yêu cầu AJAX không tuân theo / chuyển hướng.

Hóa ra là dấu gạch chéo bị thiếu ở cuối tên miền ( http://192.0.2.1/upload / )

Tôi đã kiểm tra lại với dấu gạch chéo ở cuối và tôi nhận được điều này bên dưới. Đã thêm một dấu gạch chéo trong tập lệnh và nó hiện đang hoạt động.

HTTP/1.1 200 OK => 
Date => Sat, 10 Jan 2015 04:03:53 GMT
Server => Apache/2.2.21 (Win32) mod_ssl/2.2.21 OpenSSL/1.0.0e PHP/5.3.8 mod_perl/2.0.4 Perl/v5.10.1
X-Powered-By => PHP/5.3.8
Access-Control-Allow-Origin => *
Access-Control-Allow-Methods => PUT, GET, POST, DELETE, OPTIONS
Access-Control-Allow-Headers => *
Content-Length => 1435
Connection => close
Content-Type => text/html

Sử dụng công cụ này để kiểm tra xem tiêu đề của bạn có tốt không và khắc phục sự cố những gì đang xảy ra.


5
Tôi hiện có 11 tab đang mở để giải quyết vấn đề này. Câu trả lời này nên ở nhiều nơi hơn.
JDavis

Với của tôi, tôi cần phải loại bỏ dấu gạch chéo. Rất vui vì tôi đã tìm thấy điều này. Đã dành rất nhiều thời gian để khắc phục sự cố này khi tôi mới làm, nó đáng lẽ phải làm việc hàng giờ trước.
gorelog

11

Tôi có một lưu trữ được chia sẻ trên GoDaddy. Tôi cũng cần một câu trả lời cho câu hỏi này, và sau khi tìm kiếm xung quanh, tôi thấy rằng nó có thể.

Tôi đã viết một tệp .htaccess, đặt nó trong cùng một thư mục với trang hành động của tôi. Đây là nội dung của tệp .htaccess:

Header add Access-Control-Allow-Origin "*"
Header add Access-Control-Allow-Headers "origin, x-requested-with, content-type"
Header add Access-Control-Allow-Methods "PUT, GET, POST, DELETE, OPTIONS"

Đây là cuộc gọi ajax của tôi:

    $.ajax({
        url: 'http://www.mydomain.com/myactionpagefolder/gbactionpage.php',  //server script to process data
        type: 'POST',
        xhr: function() {  // custom xhr
            myXhr = $.ajaxSettings.xhr();
            if(myXhr.upload){ // check if upload property exists
                myXhr.upload.addEventListener('progress',progressHandlingFunction, false); // for handling the progress of the upload
            }
            return myXhr;
        },
        //Ajax events
        beforeSend: beforeSendHandler,
        success: completeHandler,
        error: errorHandler,
        // Form data
        data: formData,
        //Options to tell JQuery not to process data or worry about content-type
        cache: false,
        contentType: false,
        processData: false
    });

Xem bài viết này để tham khảo:

Bộ tiêu đề Access-Control-Allow-Origin trong .htaccess không hoạt động


8

Hãy cẩn thận về:

 Header add Access-Control-Allow-Origin "*"

Điều này không đúng đắn chút nào khi cấp quyền truy cập cho tất cả mọi người. Tốt hơn là chỉ cho phép một danh sách các máy chủ đáng tin cậy biết ...

Header add Access-Control-Allow-Origin "http://aaa.example"
Header add Access-Control-Allow-Origin "http://bbb.example"
Header add Access-Control-Allow-Origin "http://ccc.example"

Trân trọng,


3
Điều này sẽ không hoạt động. Access-Control-Allow-Origin không được phép sử dụng nhiều giá trị. Bạn cần đặt động tiêu đề dựa trên giá trị của tiêu đề yêu cầu Nguồn gốc.
Quentin

7

Tôi đã kích hoạt tiêu đề mô-đun Apache tiêu đề a2enmod và vấn đề đã được giải quyết.


Các lỗi trong nhật ký không rõ ràng tại sao những thay đổi tôi đang thực hiện lại không thành công và câu trả lời này đã giúp ích rất nhiều. sudo a2enmod headersvà khởi động lại để nó hoạt động!
cchana

3

Hãy thử điều này trong .htaccess của thư mục gốc bên ngoài

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

Hãy cẩn thận trên: Header thêm Access-Control-Allow-Origin "*" Điều này không đúng đắn chút nào khi cấp quyền truy cập cho mọi người. Tôi nghĩ bạn nên sử dụng:

<IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "http://example.com"
</IfModule>

3

Tôi đã +1 câu trả lời của Miro cho liên kết đến trang web kiểm tra tiêu đề http://www.webconfs.com/http-header-check.php . Nó bật lên một quảng cáo đáng ghét mỗi khi bạn sử dụng, nhưng tuy nhiên, nó rất hữu ích để xác minh sự hiện diện của tiêu đề Access-Control-Allow-Origin.

Tôi đang đọc tệp .json từ javascript trên trang web của mình. Tôi nhận thấy rằng việc thêm phần sau vào tệp .htaccess của mình đã khắc phục được sự cố khi xem trang web của tôi trong IE 11 (phiên bản 11.447.14393.0):

<FilesMatch "\.(json)$">
  <IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "*"
  </IfModule>
</FilesMatch>

Tôi cũng đã thêm phần sau vào /etc/httpd.conf (tệp cấu hình của Apache):

AllowOverride All

Trang web kiểm tra tiêu đề đã xác minh rằng tiêu đề Access-Control-Allow-Origin hiện đang được gửi (cảm ơn, Miro!).

Tuy nhiên, Firefox 50.0.2, Opera 41.0.2353.69 và Edge 38.14393.0.0 đều có thể tìm nạp tệp, ngay cả khi không có tiêu đề Access-Control-Allow-Origin. (Lưu ý: họ có thể đang kiểm tra địa chỉ IP, vì hai miền tôi đang sử dụng đều được lưu trữ trên cùng một máy chủ, tại cùng một địa chỉ IPv4.)

Tuy nhiên, Chrome 54.0.2840,99 m (64-bit) bỏ qua tiêu đề Access-Control-Allow-Origin và không thành công, báo cáo sai:

Không có tiêu đề 'Access-Control-Allow-Origin' có trên tài nguyên được yêu cầu. Nguồn gốc ' {mydomain} ' do đó không được phép truy cập.

Tôi nghĩ điều này phải là một loại "đầu tiên". IE đang hoạt động bình thường; Chrome, Firefox, Opera và Edge đều có lỗi; và Chrome là tệ nhất . Đó không phải là điều hoàn toàn ngược lại với trường hợp thông thường sao?


0

Sau nửa ngày không có việc gì làm. Sử dụng dịch vụ kiểm tra tiêu đề mặc dù mọi thứ đều hoạt động. Bức tường lửa tại nơi làm việc đã tước bỏ chúng


0

thử cái này:

<IfModule mod_headers.c>
     Header set Access-Control-Allow-Credentials true
     Header set Access-Control-Allow-Origin "your domain"
     Header set Access-Control-Allow-Headers "X-Requested-With"
</IfModule>

Tốt hơn là cho phép một danh sách các máy chủ đáng tin cậy biết.


0

Nếu bất kỳ ai khác đang thử điều này, câu trả lời được ủng hộ nhiều nhất sẽ hoạt động. Tuy nhiên, nếu bạn gặp sự cố, có thể trình duyệt đã lưu YÊU CẦU vào bộ nhớ đệm. Để xác nhận thêm một chuỗi truy vấn.

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.