htaccess Truy cập-Kiểm soát-Cho phép-Xuất xứ


133

Tôi đang tạo một tập lệnh tải bên ngoài trên các trang web khác. Nó tải CSS và HTML và hoạt động tốt trên các máy chủ của riêng tôi.

Tuy nhiên, khi tôi thử nó trên một trang web khác, nó sẽ hiển thị lỗi khủng khiếp này:

Access-Control-Allow-Origin

Tại đây bạn có thể thấy nó tải hoàn hảo: http://tzook.info/bot/

Nhưng trên trang web khác này, nó hiển thị lỗi: http : //cantlose weight.co/robot/

Tôi đã tải tập lệnh tải lên jsfiddle: http://jsfiddle.net/TL5LK/

Tôi đã thử chỉnh sửa tập tin htaccess như thế này:

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

Hoặc như thế này:

Header set Access-Control-Allow-Origin *

Nhưng nó vẫn không hoạt động.

Câu trả lời:


267

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>

Và nếu nó chỉ liên quan đến tập lệnh .js, bạn nên bọc đoạn mã bên trong này:

<FilesMatch "\.(js)$">
...
</FilesMatch>

6
Lời khuyên tuyệt vời về việc sử dụng FilesMatch.
Nate

1
Nếu chúng ta khớp các tệp bằng cách thêm khối filematch thì *phải làm gì?
shenkwen

Và tôi có cần khởi động lại máy chủ sau khi làm việc này không? Tôi áp dụng mã ở trên nhưng nó vẫn không cho phép tôi truy cập \ .json, tôi đã đổi jsthành json.
shenkwen

3
@shenkwen Việc *cho phép mọi miền gốc truy cập tài nguyên này. Đây không phải là danh sách các tài nguyên, mà là danh sách các miền tham chiếu.
SparK

3
Trong trường hợp nó không hoạt động, bạn nên thử kích hoạt headersmô-đun:a2enmod headers
Joaquín O

53

không ai nói rằng bạn cũng phải bật mod_headers , vì vậy nếu vẫn không hoạt động, hãy thử điều này:

(các mẹo sau hoạt động trên Ubuntu, không biết về các bản phân phối khác)

bạn có thể kiểm tra danh sách các mô-đun được tải với

apache2ctl -M

để kích hoạt mod_headers bạn có thể sử dụng

a2enmod headers

tất nhiên sau bất kỳ thay đổi nào trong Apache, bạn phải khởi động lại nó:

/etc/init.d/apache2 restart

Sau đó, bạn có thể sử dụng

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

Và nếu mod_headers không hoạt động, dòng này sẽ không làm gì cả. Bạn có thể thử bỏ qua mệnh đề if và chỉ cần thêm Header set Access-Control-Allow-Origin "*"vào cấu hình của mình, sau đó nó sẽ đưa ra lỗi trong khi bắt đầu nếu mod_headers không hoạt động.


3
đã thử tất cả các tùy chọn tôi có thể tìm thấy trên Google và, như bạn đã nói, không ai nói gì về mod_headers. Cảm tạ!
Sirkong

1
Mod_headers của tôi đang hoạt động và đã thêm dòng này trong .htaccess (cùng địa điểm như đã đề cập), nhưng vẫn gặp lỗi này: Phản hồi cho preflight có mã trạng thái HTTP không hợp lệ 400..Pls đề xuất!
Sushivam

1
mod_headers là điều còn thiếu! Điều này hoạt động hoàn hảo với quy tắc .htaccess. Cảm ơn bạn.
Andy

@SachinS không tìm thấy lỗi 400, 500 là lỗi máy chủ. Bắt đầu từ đó
Andy

30

từ kinh nghiệm của tôi;

nếu nó không hoạt động từ bên trong phpthì hãy làm việc này .htaccessvới tôi

<IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin http://www.vknyvz.com  
    Header set Access-Control-Allow-Credentials true
</IfModule>
  • thông tin đăng nhập có thể đúng hoặc sai tùy thuộc vào thông số yêu cầu ajax của bạn

Điều này không làm việc cho tôi nhưng tôi đã có thể làm cho nó hoạt động trong php, cùng một nguyên tắc.
RevNoah

14

Thêm một .htaccesstệp với các chỉ thị sau vào thư mục phông chữ của bạn, nếu có vấn đề khi truy cập phông chữ của bạn. Có thể dễ dàng được sửa đổi để sử dụng với các tệp .css hoặc .js .

<FilesMatch "\.(eot|ttf|otf|woff)$">
    Header set Access-Control-Allow-Origin "*"
</FilesMatch>

1
Cần lưu ý rằng <FilesMatch>chỉ thị trên là không cần thiết, nếu , như được đề xuất ở trên, .htaccesstệp của bạn nằm trong thư mục phông chữ của bạn thư mục phông chữ của bạn chỉ chứa .eot,. ttf, .otfVà / hoặc .wofftập tin.
Mesagoma

9

Các câu trả lời khác không hiệu quả với tôi, đây là kết cục của trò lừa đảo apache2:

1) Kích hoạt mod tiêu đề:

sudo a2enmod headers

2) Tạo /etc/apache2/mods-enabled/headers.conftập tin và chèn:

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

3) Khởi động lại máy chủ của bạn:

sudo service apache2 restart


Đây là giải pháp duy nhất phù hợp với tôi trên máy chủ Ubuntu 16.10.
kneeki

Điều này cũng làm việc cho tôi. Tôi đang sử dụng máy chủ Ubuntu 16.04. Cảm ơn bạn.
jhedm

Làm việc cho tôi trên Ubuntu 18.04. Mặc dù vậy, Firefox 70.0.1 không hài lòng với tiêu đề Access-Control-Allow-Origin và tôi cũng phải thêm một phương thức Access-Control-Allow-Allow.
borizzzzz

@songololo Tôi không thể tìm thấy tệp này cho apache trong Centos 7. Tôi đã tìm mọi nơi trong thư mục / etc / httpd. Bạn có thể vui lòng cho tôi biết làm thế nào tôi có thể triển khai nó trên Centos không?
Mainuddin

@Mainuddin, xin lỗi, tôi không quen với Centos. Hy vọng người khác có thể kêu vang.
songololo

7

Trong Zend Framework 2.0 tôi đã gặp vấn đề này. Có thể được giải theo hai cách .htaccess hoặc php tiêu đề tôi thích .htaccess vì vậy tôi đã sửa đổi .htaccess từ:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]

đến

RewriteEngine On

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

RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]

và nó bắt đầu làm việc


Điều này đã cứu ngày của tôi, php couddnt hoạt động, vì vậy htaccess đã làm điều đó.
Relm

4

BTW: cấu hình .htaccess phải được thực hiện trên máy chủ lưu trữ API. Ví dụ: bạn tạo ứng dụng AngularJS trên tên miền x.com và tạo API nghỉ ngơi trên y.com, bạn nên đặt Access-Control-Allow-Origin "*" trong tệp .htaccess trên thư mục gốc của y.com chứ không phải x .com :)

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

Cũng như Lukas đã đề cập, đảm bảo bạn đã kích hoạt mod_headers nếu bạn sử dụng Apache


1

Hãy chắc chắn rằng bạn không có một chuyển hướng xảy ra. Điều này có thể xảy ra nếu bạn không bao gồm dấu gạch chéo trong URL.

Xem câu trả lời này để biết thêm chi tiết - https://stackoverflow.com/a/27872891/614524


0

Nếu máy chủ của bạn không ở pvn hoặc dành riêng, việc khởi động lại máy chủ sẽ rất khó khăn.

Giải pháp tốt hơn từ tôi, chỉ cần chỉnh sửa tệp CSS của bạn (tại một tên miền khác hoặc tên miền phụ của bạn) gọi phông chữ eot, woff, v.v. đến nguồn gốc của bạn (tên miền của bạn hoặc www yourdomain). nó sẽ giải quyết vấn đề của bạn

Ý tôi là, chỉnh sửa url tương đối trên css thành miền gốc url tuyệt đối

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.