Cách thêm tiêu đề Access-Control-Allow-Origin


99

Tôi đang thiết kế một trang web (ví dụ: mywebsite.com) và trang này tải các phông chữ font-face từ một trang khác (ví dụ như anothersite.com). Tôi đang gặp sự cố với việc tải phông chữ khuôn mặt phông chữ trong Firefox và tôi đã đọc trên blog này :

Firefox (hỗ trợ @ font-face từ phiên bản 3.5) không cho phép phông chữ tên miền chéo theo mặc định. Điều này có nghĩa là phông chữ phải được cung cấp từ cùng một miền (và miền phụ) trừ khi bạn có thể thêm tiêu đề “Access-Control-Allow-Origin” vào phông chữ.

Làm cách nào để đặt tiêu đề Access-Control-Allow-Origin thành phông chữ?


tìm thấy điều này có liên quan: stackoverflow.com/q/14003332/1423096
alo Malbarez

Câu trả lời:


164

Vì vậy, những gì bạn làm là ... Trong thư mục tệp phông chữ, hãy đặt một tệp htaccess với nội dung sau.

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

cũng trong tệp CSS từ xa của bạn, khai báo font-face cần có URL tuyệt đối đầy đủ của tệp phông chữ (không cần thiết trong tệp CSS cục bộ):

ví dụ

@font-face {
    font-family: 'LeagueGothicRegular';
    src: url('http://www.example.com/css/fonts/League_Gothic.eot?') format('eot'),
         url('http://www.example.com/css/fonts/League_Gothic.woff') format('woff'),
         url('http://www.example.com/css/fonts/League_Gothic.ttf') format('truetype'),
         url('http://www.example.com/css/fonts/League_Gothic.svg')

}

Điều đó sẽ khắc phục sự cố. Một điều cần lưu ý là bạn có thể chỉ định chính xác miền nào nên được phép truy cập phông chữ của bạn. Trong htaccess ở trên, tôi đã chỉ định rằng mọi người đều có thể truy cập phông chữ của tôi, "*"tuy nhiên bạn có thể giới hạn nó ở:

Một URL duy nhất:

Bộ tiêu đề Access-Control-Allow-Origin http://example.com

Hoặc danh sách URL được phân tách bằng dấu phẩy

Access-Control-Allow-Origin: http://site1.com,http://site2.com

(Nhiều giá trị không được hỗ trợ trong các triển khai hiện tại)


1
Bạn không phải sử dụng đường dẫn đầy đủ. Đơn giản url('/fonts/League_Gothic.woff') format('woff')là đủ giả sử bạn giữ thư mục 'phông chữ' trong cùng một tệp với tệp .css của bạn.
StrayObject

1
Giải pháp này cũng hợp lệ cho các yêu cầu .ajax tên miền chéo !! Đẹp!
Isaac

3
@StrayObject - tệp CSS từ xa sẽ cần sử dụng các đường dẫn đầy đủ. Tệp CSS cục bộ không cần phải làm như vậy.
Mazatec

Rõ ràng là không thể đưa vào danh sách trắng nhiều URL, được phân tách bằng dấu phẩy hoặc cách khác; thấy lỗi 671.608
TGR

1
Câu trả lời này ( stackoverflow.com/a/4110601 ) dường như cho thấy một dấu phẩy tách ra danh sách không làm việc
Asaf

21

Theo tài liệu chính thức , các trình duyệt không thích nó khi bạn sử dụng

Access-Control-Allow-Origin: "*"

tiêu đề nếu bạn cũng đang sử dụng

Access-Control-Allow-Credentials: "true"

đầu trang. Thay vào đó, họ muốn bạn cho phép xuất xứ của họ một cách cụ thể. Nếu bạn vẫn muốn cho phép tất cả các nguồn gốc, bạn có thể thực hiện một số phép thuật Apache đơn giản để nó hoạt động (đảm bảo bạn đã mod_headersbật):

Header set Access-Control-Allow-Origin "%{HTTP_ORIGIN}e" env=HTTP_ORIGIN

Các trình duyệt được yêu cầu gửi Origintiêu đề trên tất cả các yêu cầu tên miền chéo. Tài liệu nói rõ rằng bạn cần lặp lại tiêu đề này trong Access-Control-Allow-Origintiêu đề nếu bạn đang chấp nhận / dự định chấp nhận yêu cầu. Đó là những gì Headerchỉ thị này đang làm.


2
điều đó dường như cũng hiệu quả đối với tôi, mặc dù nó có vẻ có tác dụng phụ là cần phải xóa bộ nhớ cache của bạn nếu bạn truy cập hai trang web khác nhau cùng truy cập trang web
Jack James

1
@Jack: vâng, đó là một nội dung lớn cho nội dung CDN (nhìn vào bạn, tệp phông chữ). Tùy thuộc vào cài đặt bộ nhớ đệm, bạn có thể kết thúc với nội dung tệp và tiêu đề CORS không chính xác vẫn tồn tại cục bộ (như trong kịch bản của bạn) hoặc trên proxy! (chặn bộ nhớ cache ?yourdomainhoạt động trong trường hợp sau, nhưng làm giảm giá trị lợi ích của việc sử dụng CDN một chút)
ov

2
Vì một số lý do, HTTP_ORIGIN không được thiết lập cho tôi, tôi phải thêm dòng này SetEnvIfNoCase Origin (.+) HTTP_ORIGIN=$1.
David Riccitelli

5

Rất tiếc, câu trả lời được chấp nhận không phù hợp với tôi, vì tệp CSS trang web của tôi @ nhập các tệp CSS phông chữ và tất cả chúng đều được lưu trữ trên CDN của Tệp đám mây Rackspace.

Vì tiêu đề Apache không bao giờ được tạo (vì CSS của tôi không có trên Apache), tôi đã phải làm một số việc:

  1. Đi tới giao diện người dùng tệp trên đám mây và thêm tiêu đề tùy chỉnh (Access-Control-Allow-Origin với giá trị *) cho mỗi tệp phông chữ tuyệt vời
  2. Thay đổi Loại-Nội dung của tệp woff và ttf thành phông chữ / woff và phông chữ / ttf tương ứng

Xem liệu bạn có thể thoát khỏi chỉ với # 1 không, vì thứ hai yêu cầu một chút thao tác dòng lệnh.

Để thêm tiêu đề tùy chỉnh trong # 1:

  • xem vùng chứa tệp trên đám mây cho tệp
  • cuộn xuống tệp
  • nhấp vào biểu tượng bánh răng
  • nhấp vào Chỉnh sửa Tiêu đề
  • chọn Access-Control-Allow-Origin
  • thêm ký tự đơn '*' (không có dấu ngoặc kép)
  • Nhấn Enter
  • lặp lại cho các tệp khác

Nếu bạn cần tiếp tục và thực hiện # 2, thì bạn sẽ cần một dòng lệnh với CURL

curl -D - --header "X-Auth-Key: your-auth-key-from-rackspace-cloud-control-panel" --header "X-Auth-User: your-cloud-username" https://auth.api.rackspacecloud.com/v1.0

Từ kết quả trả về, trích xuất các giá trị cho X-Auth-Token và X-Storage-Url

curl -X POST \
  -H "Content-Type: font/woff" \
  --header "X-Auth-Token: returned-x-auth-token" returned-x-storage-url/name-of-your-container/fonts/fontawesome-webfont.woff

curl -X POST \
  -H "Content-Type: font/ttf" \
  --header "X-Auth-Token: returned-x-auth-token" returned-x-storage-url/name-of-your-container/fonts/fontawesome-webfont.ttf

Tất nhiên, quá trình này chỉ hoạt động nếu bạn đang sử dụng Rackspace CDN. Các CDN khác có thể cung cấp các phương tiện tương tự để chỉnh sửa tiêu đề đối tượng và thay đổi loại nội dung, vì vậy có thể bạn sẽ gặp may (và đăng thêm một số thông tin ở đây).


3

Đối với Ứng dụng dựa trên Java, hãy thêm phần này vào tệp web.xml của bạn:

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.ttf</url-pattern>
</servlet-mapping>

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.otf</url-pattern>
</servlet-mapping>

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.eot</url-pattern>
</servlet-mapping>

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.woff</url-pattern>
</servlet-mapping>


1

Trong file.php của bạn yêu cầu ajax, có thể đặt tiêu đề giá trị.

<?php header('Access-Control-Allow-Origin: *'); //for all ?>
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.