Phông chữ từ nguồn gốc đã bị chặn tải bởi chính sách Chia sẻ tài nguyên chéo


159

Tôi đang nhận được lỗi sau trên một vài trình duyệt Chrome nhưng không phải tất cả. Không chắc chắn hoàn toàn vấn đề là gì vào thời điểm này.

Phông chữ từ nguồn gốc ' https://ABCDEFG.cloudfront.net ' đã bị chặn tải bởi chính sách Chia sẻ tài nguyên nguồn gốc chéo: Không có tiêu đề 'Kiểm soát truy cập-cho phép-xuất xứ' trên tài nguyên được yêu cầu. Do đó, nguồn gốc ' https://sub.domain.com ' không được phép truy cập.

Tôi có cấu hình CORS sau trên S3

<CORSConfiguration>
 <CORSRule>
   <AllowedOrigin>*</AllowedOrigin>
   <AllowedHeader>*</AllowedHeader>
   <AllowedMethod>GET</AllowedMethod>
 </CORSRule>
</CORSConfiguration>

Yêu cầu

Remote Address:1.2.3.4:443
Request URL:https://abcdefg.cloudfront.net/folder/path/icons-f10eba064933db447695cf85b06f7df3.woff
Request Method:GET
Status Code:200 OK
Request Headers
Accept:*/*
Accept-Encoding:gzip,deflate
Accept-Language:en-US,en;q=0.8
Cache-Control:no-cache
Connection:keep-alive
Host:abcdefg.cloudfront.net
Origin:https://sub.domain.com
Pragma:no-cache
Referer:https://abcdefg.cloudfront.net/folder/path/icons-e283e9c896b17f5fb5717f7c9f6b05eb.css
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.94 Safari/537.36

Tất cả các yêu cầu khác từ Cloudfront / S3 đều hoạt động chính xác, bao gồm các tệp JS.


5
Tôi đang gặp vấn đề tương tự ... Tôi bắt đầu nhận thấy nó sau khi nâng cấp lên chrome 37.0.2062.94
kirley

Sau khi cập nhật Cấu hình CORS, tôi đổi tên các tài sản và quản lý để nó hoạt động. Vì vậy, 1) Cấu hình CORS chỉ được áp dụng khi tạo tệp (không cập nhật) HOẶC 2) Cấu hình CORS được lưu trong bộ nhớ cache tại Cloudfront. Tôi sẽ đăng bài này như một câu trả lời nếu những người khác có thể xác nhận nó cũng hoạt động với họ.
Dallas Clark

1
Chỉ cần lưu ý điều này với Chrome v. 37.0.2062.94 nhưng không phải là phiên bản cũ hơn. Tôi hoàn toàn không có cấu hình CORS trên S3, vì vậy điều này không nên xảy ra, phải không?
Ghopper21

1
@ Ghopper21 bạn cần cấu hình CORS đúng. Thử nghiệm trong firefox và điều đó sẽ cho bạn kết quả tương tự (có thể).
Tim Diggins

1
@RichPeck - khắc phục bằng cách thêm cấu hình CORS chính xác vào S3 (hoặc nếu tự động tạo CDN từ nguồn, thì phức tạp hơn một chút - bạn phải thêm các tiêu đề phù hợp, sau đó vô hiệu hóa phông chữ được lưu trong bộ nhớ cache của bạn) ... stackoverflow.com / câu hỏi / 12229844 / Nhận xem câu trả lời bên dưới để biết thêm chi tiết
Tim Diggins

Câu trả lời:


87

Thêm quy tắc này vào .htaccess của bạn

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

thậm chí tốt hơn, như được đề xuất bởi @david thomas, bạn có thể sử dụng một giá trị tên miền cụ thể, ví dụ:

Header add Access-Control-Allow-Origin "your-domain.com"

1
Xin chào, sự khác biệt với Header set Access-Control-Allow-Origin "*"cái gì? Cảm ơn
NineCattoRules

8
đối với người dùng windows, hãy đặt <add name = "Access-Control-allow-Origin" value = "*" /> trong <customHeaders> trong tệp web.config. Chúc một ngày tốt lành
Arsalan Saleem

2
@Simone sự khác biệt là với "thêm" tiêu đề phản hồi được thêm vào bộ tiêu đề hiện có, ngay cả khi tiêu đề này đã tồn tại. Điều này có thể dẫn đến hai (hoặc nhiều) tiêu đề có cùng tên; trong khi với "set", tiêu đề phản hồi được đặt, thay thế bất kỳ tiêu đề nào trước đó bằng tên này. Trong trường hợp này là cùng một nguyên nhân * bao gồm tất cả.
Giovanni Di Gregorio

@GiovanniDiGregorio Cảm ơn thông tin tốt đẹp!
NineCattoRules

21
Chỉ cần lưu ý Access-Control-Allow-Origin "*"là có khả năng không an toàn vì nó mở tên miền để truy cập javascript từ bất kỳ tên miền nào. Thay vào đó, bạn nên sử dụng một giá trị tên miền cụ thể, ví dụ: Access-Control-Allow-Origin "http://example1.com"Xem thêm stackoverflow.com/a/10636765/583715 để được giải thích tốt.
David Thomas

58

Chrome kể từ ~ tháng 9/10 năm 2014 làm cho các phông chữ phải chịu các kiểm tra CORS giống như Firefox đã thực hiện https://code.google.com.vn/p/chromium/issues/detail?id=286681 . Có một cuộc thảo luận về vấn đề này trong https://groups.google.com/a/chromium.org/forum/?fromgroups=#!topic/blink-dev/TT9D5-Zfnzw

Vì các phông chữ trình duyệt có thể thực hiện kiểm tra trước , chính sách S3 của bạn cũng cần tiêu đề yêu cầu cors . Bạn có thể kiểm tra trang của mình bằng Safari (hiện tại không kiểm tra CORS cho phông chữ) và Firefox (điều đó) để kiểm tra kỹ xem đây có phải là sự cố được mô tả không.

Xem câu trả lời tràn Stack trên Amazon S3 CORS (Chia sẻ tài nguyên nguồn gốc chéo) và tải phông chữ chéo tên miền Firefox để biết chi tiết Amazon S3 CORS.

NB nói chung vì điều này được sử dụng để chỉ áp dụng cho Firefox, vì vậy nó có thể giúp tìm kiếm Firefox hơn là Chrome.


Cảm ơn câu trả lời này, có vẻ như nó có thể là một vấn đề cho nhiều người khác. Mặc dù sự cố của tôi đã xảy ra trong bản dựng Chrome ổn định.
Dallas Clark

45
Điều này đang xảy ra trong Chrome.
justingordon

Khi mọi người tiếp tục đề cập (bao gồm cả bản thân tôi!) Cho câu trả lời này, tôi đã làm cho nó ít lịch sử hơn và phù hợp hơn cho đến ngày nay.
Tim Diggins

1
Ngoài ra FYI tôi đã phát hiện ra rằng một thông báo lỗi "đã bị chặn tải bởi chính sách Chia sẻ tài nguyên nguồn gốc chéo: Không có tiêu đề 'Kiểm soát truy cập-cho phép-xuất xứ' trên tài nguyên được yêu cầu. Xuất xứ" thực sự có liên quan đến việc có lỗi đường dẫn đến tệp phông chữ trong máy chủ gốc của tôi và trên nền tảng đám mây sau đó chuyển hướng đến trang chủ của máy chủ của tôi (và phản hồi chuyển hướng hoặc trang chủ không có tiêu đề CORS). Nhầm lẫn, nhưng được giải quyết bằng cách sử dụng đường dẫn chính xác đến tệp phông chữ thực tế (không phải là vấn đề CORS, nói đúng).
Tim Diggins

Xin chào @DallasClark, bạn có thể muốn chọn một câu trả lời được chấp nhận cho câu hỏi của bạn. Cảm ơn Tim, các liên kết và giải thích của bạn rất hữu ích trong kinh nghiệm của tôi. Chúc mừng.
Dan

46

Tôi đã có thể giải quyết vấn đề bằng cách thêm <AllowedMethod>HEAD</AllowedMethod>vào chính sách CORS của Nhóm S3.

Thí dụ:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedMethod>HEAD</AllowedMethod>
    <MaxAgeSeconds>3000</MaxAgeSeconds>
    <AllowedHeader>Authorization</AllowedHeader>
</CORSRule>
</CORSConfiguration>

tuy nhiên không chắc chắn về bảo mật, sẽ rất tuyệt nếu ai đó có một số thông tin về điều đó ..
Özer S.

Doe thay đổi này cần thời gian để tuyên truyền? Tôi vừa thêm vào <AllowedMethod>HEAD</AllowedMethod>chính sách CORS của mình trên thùng và nó vẫn không hoạt động.
Salvatore Iovene

thường là không, nó sẽ mất tối đa. vài phút
Özer S.


12

Vào ngày 26 tháng 6 năm 2014 AWS đã phát hành Vary: Origin hành vi thích hợp trên CloudFront để bây giờ bạn chỉ cần

Đặt cấu hình CORS cho nhóm S3 của bạn:

<AllowedOrigin>*</AllowedOrigin>

Trong CloudFront -> Phân phối -> Hành vi cho nguồn gốc này, hãy sử dụng tùy chọn Chuyển tiếp tiêu đề: Danh sách trắng và liệt kê danh sách tiêu đề 'Xuất xứ'.

Đợi khoảng 20 phút trong khi CloudFront tuyên truyền quy tắc mới

Bây giờ, bản phân phối CloudFront của bạn sẽ lưu trữ các phản hồi khác nhau (với các tiêu đề CORS phù hợp) cho các tiêu đề Origin của khách hàng khác nhau.


1
Điều này dường như không hoạt động, bạn có nhiều chi tiết hơn? Tôi đã kích hoạt tính năng này nhưng tôi vẫn gặp chính xác vấn đề tương tự.
Jaco Pretorius

7

Điều duy nhất đã làm việc cho tôi (có lẽ vì tôi không nhất quán với việc sử dụng www.):

Dán tệp này vào tệp .htaccess của bạn:

<IfModule mod_headers.c>
<FilesMatch "\.(eot|font.css|otf|ttc|ttf|woff)$">
    Header set Access-Control-Allow-Origin "*"
</FilesMatch>
</IfModule>
<IfModule mod_mime.c>
# Web fonts
AddType application/font-woff woff
AddType application/vnd.ms-fontobject eot

# Browsers usually ignore the font MIME types and sniff the content,
# however, Chrome shows a warning if other MIME types are used for the
# following fonts.
AddType application/x-font-ttf ttc ttf
AddType font/opentype otf

# Make SVGZ fonts work on iPad:
# https://twitter.com/FontSquirrel/status/14855840545
AddType     image/svg+xml svg svgz
AddEncoding gzip svgz

</IfModule>

# rewrite www.example.com → example.com

<IfModule mod_rewrite.c>
RewriteCond %{HTTPS} !=on
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^ http://%1%{REQUEST_URI} [R=301,L]
</IfModule>

http://ce3wiki.theturngate.net/doku.php?id=cross-domain_issues_broken_web_fonts


1
Tuyệt vời! Cảm ơn rất nhiều!
Rotimi

1
Vì mã của bạn là chi tiết, phải mất một thời gian để tôi lướt qua nó, tôi đã học được vài điều mặc dù. Tôi đã áp dụng một phần của nó để điều chỉnh giải pháp của tôi. Nó đã làm việc.
Mohammed Moinuddin Waseem

3

Tôi đã có cùng một vấn đề và liên kết này cung cấp giải pháp cho tôi:

http://www.holovaty.com/wr/cors-ie-cloudfront/

Phiên bản ngắn của nó là:

  1. Chỉnh sửa cấu hình S3 CORS (mẫu mã của tôi không hiển thị đúng)
    Lưu ý: Điều này đã được thực hiện trong câu hỏi ban đầu
    Lưu ý: mã được cung cấp không an toàn lắm, có thêm thông tin trong trang được liên kết.
  2. Chuyển đến tab "Hành vi" của bản phân phối của bạn và nhấp để chỉnh sửa
  3. Thay đổi "Tiêu đề chuyển tiếp" từ Ngôi nhà Không (Cải thiện bộ nhớ đệm) thành Tập sách trắng.
  4. Thêm nguồn gốc Origin vào danh sách "Tiêu đề danh sách trắng"
  5. Lưu các thay đổi

Phân phối trên nền tảng đám mây của bạn sẽ cập nhật, mất khoảng 10 phút. Sau đó, tất cả sẽ ổn, bạn có thể xác minh bằng cách kiểm tra xem các thông báo lỗi liên quan đến CORS đã biến mất khỏi trình duyệt.


2

Đối với những người sử dụng các sản phẩm của Microsoft có tệp web.config:

Hợp nhất điều này với web.config của bạn.

Để cho phép trên bất kỳ tên miền thay thế value="domain"bằngvalue="*"

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.webserver>
    <httpprotocol>
      <customheaders>
        <add name="Access-Control-Allow-Origin" value="domain" />
      </customheaders>
    </httpprotocol>
  </system.webserver>
</configuration>

Nếu bạn không có quyền chỉnh sửa web.config, thì hãy thêm dòng này vào mã phía máy chủ của bạn.

Response.AppendHeader("Access-Control-Allow-Origin", "domain");

Xứng đáng bỏ phiếu cho việc nhớ chúng tôi người dùng Windows.
mohrtan

Tôi đang sử dụng lõi asp.net, làm cách nào để thêm tệp này vào tệp appsinstall.json?
Yusuff Sodiq

1

Có một writeup tốt đẹp ở đây .

Cấu hình này trong nginx / apache là một sai lầm.
Nếu bạn đang sử dụng một công ty lưu trữ, bạn không thể cấu hình cạnh.
Nếu bạn đang sử dụng Docker, ứng dụng sẽ được khép kín.

Lưu ý rằng một số ví dụ sử dụng connectHandlersnhưng điều này chỉ đặt tiêu đề trên tài liệu. Sử dụng rawConnectHandlersáp dụng cho tất cả các tài sản được phục vụ (phông chữ / css / vv).

  // HSTS only the document - don't function over http.  
  // Make sure you want this as it won't go away for 30 days.
  WebApp.connectHandlers.use(function(req, res, next) {
    res.setHeader('Strict-Transport-Security', 'max-age=2592000; includeSubDomains'); // 2592000s / 30 days
    next();
  });

  // CORS all assets served (fonts/etc)
  WebApp.rawConnectHandlers.use(function(req, res, next) {
    res.setHeader('Access-Control-Allow-Origin', '*');
    return next();
  });

Đây sẽ là thời điểm tốt để xem xét chính sách trình duyệt như đóng khung, v.v.


0

Chỉ cần thêm sử dụng nguồn gốc trong của bạn nếu bạn sử dụng node.js làm máy chủ ...

như thế này

  app.use((req, res, next) => {
  res.header('Access-Control-Allow-Origin', '*');
  next();
});

Chúng tôi cần phản hồi về nguồn gốc


-5

Giải pháp làm việc cho heroku có tại đây http://kennethjiang.blogspot.com/2014/07/set-up-cors-in-cloudfront-for-custom.html (trích dẫn theo sau):

Dưới đây là chính xác những gì bạn có thể làm nếu bạn đang chạy ứng dụng Rails trong Heroku và sử dụng Cloudfront làm CDN. Nó đã được thử nghiệm trên Ruby 2.1 + Rails 4, ngăn xếp Heroku Cedar.

Thêm tiêu đề CORS HTTP (Kiểm soát truy cập- *) vào nội dung phông chữ

  • Thêm đá quý font_assetsvào Gemfile.
  • bundle install
  • Thêm config.font_assets.origin = '*'vào config/application.rb. Nếu bạn muốn kiểm soát chi tiết hơn, bạn có thể thêm các giá trị gốc khác nhau vào môi trường khác nhau, ví dụ:config/config/environments/production.rb
  • curl -I http://localhost:3000/assets/your-custom-font.ttf
  • Đẩy mã đến Heroku.

Định cấu hình Cloudfront để chuyển tiếp các tiêu đề HTTP CORS

Trong Cloudfront, chọn phân phối của bạn, trong tab "hành vi", chọn và chỉnh sửa mục nhập kiểm soát việc phân phối phông chữ của bạn (đối với hầu hết ứng dụng Rails đơn giản, bạn chỉ có 1 mục nhập tại đây). Thay đổi tiêu đề chuyển tiếp từ "Không" thành "Whilelist". Và thêm các tiêu đề sau vào danh sách trắng:

Access-Control-Allow-Origin
Access-Control-Allow-Methods
Access-Control-Allow-Headers
Access-Control-Max-Age

Lưu nó và đó là nó!

Hãy cẩn thận: Tôi thấy rằng đôi khi Firefox sẽ không làm mới phông chữ ngay cả khi lỗi CORS không còn nữa. Trong trường hợp này, hãy tiếp tục làm mới trang một vài lần để thuyết phục Firefox rằng bạn thực sự quyết tâm.


4
Vui lòng tránh các câu trả lời chỉ liên kết. Sẽ rất hữu ích nếu bạn có thể sao chép các đoạn có liên quan ra khỏi bài viết được liên kết vào câu trả lời của bạn. Cảm ơn.
bPratik
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.