Ładowanie czcionki z pochodzenia zostało zablokowane przez zasady współdzielenia zasobów między źródłami

159

Otrzymuję następujący błąd w kilku przeglądarkach Chrome, ale nie we wszystkich. Nie jestem do końca pewien, na czym polega problem w tym momencie.

Czcionka z pochodzenia „ https://ABCDEFG.cloudfront.net ” została zablokowana przed ładowaniem przez zasady współdzielenia zasobów między źródłami: Żądany zasób nie zawiera nagłówka „Access-Control-Allow-Origin”. Dlatego Origin „ https://sub.domain.com ” nie ma dostępu.

Mam następującą konfigurację CORS na S3

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

Prośba

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

Wszystkie inne żądania z Cloudfront / S3 działają poprawnie, w tym pliki JS.

Dallas Clark
źródło
5
Mam ten sam problem ... Zacząłem to zauważać po uaktualnieniu do chrome 37.0.2062.94
kirley
Po zaktualizowaniu konfiguracji CORS zmieniłem nazwy zasobów i udało mi się je uruchomić. Zatem albo 1) Konfiguracja CORS jest stosowana tylko podczas tworzenia pliku (nie aktualizuje) LUB 2) Konfiguracja CORS jest buforowana w Cloudfront. Opublikuję to jako odpowiedź, jeśli inni mogą potwierdzić, że to działa również dla nich.
Dallas Clark
1
Właśnie zauważyłem to w Chrome wer. 37.0.2062.94, ale nie we wcześniejszej wersji. W ogóle nie mam konfiguracji CORS na S3, więc to nie powinno się dziać, prawda?
Ghopper21
1
@ Ghopper21 potrzebujesz odpowiedniej konfiguracji CORS. Przetestuj w przeglądarce Firefox, a to da (prawdopodobnie) ten sam wynik.
Tim Diggins,
1
@RichPeck - fix dodając odpowiednie CORS config do S3 (lub jeśli automatyczne tworzenie CDN od źródła, to jest to nieco bardziej skomplikowane - trzeba dodać odpowiednie nagłówki, następnie unieważnić swoje buforowane czcionek) ... stackoverflow.com / pytania / 12229844 /… zobacz odpowiedź poniżej, aby uzyskać więcej informacji
Tim Diggins

Odpowiedzi:

87

Dodaj tę regułę do swojego .htaccess

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

jeszcze lepiej, jak sugeruje @david thomas, możesz użyć określonej wartości domeny, np

Header add Access-Control-Allow-Origin "your-domain.com"
Giovanni Di Gregorio
źródło
1
Cześć, jaka jest różnica Header set Access-Control-Allow-Origin "*"? Dzięki
NineCattoRules
8
w przypadku osób z systemem Windows ustaw <add name = "Access-Control-Allow-Origin" value = "*" /> w obszarze <customHeaders> w pliku web.config. Miłego dnia
Arsalan Saleem,
2
@Simone różnica polega na tym, że przy „add” nagłówek odpowiedzi jest dodawany do istniejącego zestawu nagłówków, nawet jeśli ten nagłówek już istnieje. Może to skutkować dwoma (lub więcej) nagłówkami o tej samej nazwie; podczas gdy przy „set” ustawiany jest nagłówek odpowiedzi, zastępując poprzedni nagłówek tą nazwą. W tym przypadku jest ta sama przyczyna * obejmuje je wszystkie.
Giovanni Di Gregorio
@GiovanniDiGregorio Dzięki za miłe informacje!
NineCattoRules
21
Samo odnotowanie Access-Control-Allow-Origin "*"jest potencjalnie niebezpieczne, ponieważ otwiera domenę na dostęp javascript z dowolnej domeny. Zamiast tego powinieneś użyć określonej wartości domeny, np. Access-Control-Allow-Origin "http://example1.com"Zobacz także stackoverflow.com/a/10636765/583715, aby uzyskać dobre wyjaśnienie.
David Thomas
59

Chrome od ~ września / października 2014 r. Poddaje czcionki tym samym kontrolom CORS, co Firefox https://code.google.com/p/chromium/issues/detail?id=286681 . Jest dyskusja na ten temat na https://groups.google.com/a/chromium.org/forum/?fromgroups=#!topic/blink-dev/TT9D5-Zfnzw

Biorąc pod uwagę, że w przypadku czcionek przeglądarka może przeprowadzić kontrolę wstępną , Twoja zasada S3 również wymaga nagłówka żądania cors . Możesz sprawdzić swoją stronę w, powiedzmy, Safari (która obecnie nie sprawdza czcionek za pomocą CORS) i Firefoksie (to robi), aby dokładnie sprawdzić, czy jest to opisany problem.

Zobacz odpowiedź na temat przepełnienia stosu na Amazon S3 CORS (Cross-Origin Resource Sharing) i ładowanie czcionek międzydomenowych przeglądarki Firefox, aby uzyskać szczegółowe informacje na temat Amazon S3 CORS.

Uwaga: ogólnie rzecz biorąc, ponieważ dotyczyło to tylko przeglądarki Firefox, więc może pomóc wyszukiwanie przeglądarki Firefox, a nie Chrome.

Tim Diggins
źródło
Dzięki za tę odpowiedź, wygląda na to, że może to być problem dla wielu innych. Chociaż mój problem występował w stabilnej wersji Chrome.
Dallas Clark,
45
To dzieje się teraz w Chrome.
justingordon
Ponieważ ludzie wciąż odnoszą się (w tym ja!) Do tej odpowiedzi, uczyniłem ją mniej historyczną i bardziej aktualną w dzisiejszych czasach.
Tim Diggins
1
Również do Twojej wiadomości, odkryłem, że komunikat o błędzie „został zablokowany przed wczytaniem przez zasady współdzielenia zasobów między źródłami: Brak nagłówka„ Access-Control-Allow-Origin ”w żądanym zasobie. Origin” było tak naprawdę związane z posiadaniem złego ścieżka do pliku czcionki na moim oryginalnym serwerze, a następnie cloudfront przekierowanie do strony głównej mojego serwera (a odpowiedź przekierowania lub strona główna nie zawierały nagłówków CORS). Mylące, ale rozwiązane przez użycie poprawnej ścieżki do rzeczywistego pliku czcionek (nie jest to problem CORS, ściśle mówiąc).
Tim Diggins
Hej @DallasClark, możesz wybrać zaakceptowaną odpowiedź na swoje pytanie. Dzięki Tim, twoje linki i wyjaśnienia były pomocne w moim doświadczeniu. Twoje zdrowie.
Dan
46

Udało mi się rozwiązać problem, po prostu dodając <AllowedMethod>HEAD</AllowedMethod>do polityki CORS łyżki S3.

Przykład:

<?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>
Özer S.
źródło
nie jestem jednak pewien co do bezpieczeństwa, byłoby miło, gdyby ktoś miał w tym jakiś wkład…
Özer S.
Czy ta zmiana potrzebuje czasu, aby się rozprzestrzenić? Właśnie dodałem <AllowedMethod>HEAD</AllowedMethod>do moich zasad CORS w zasobniku i nadal nie działa.
Salvatore Iovene
zwykle nie, powinno to zająć max. kilka minut
Özer S.
12

26 czerwca 2014 AWS wydało poprawne zachowanie Vary: Origin na CloudFront, więc teraz po prostu

Ustaw konfigurację CORS dla swojego zasobnika S3:

<AllowedOrigin>*</AllowedOrigin>

W CloudFront -> Distribution -> Behaviors dla tego źródła, użyj opcji Forward Headers: Whitelist i dodaj do białej listy nagłówek „Origin”.

Poczekaj około 20 minut, aż CloudFront propaguje nową regułę

Teraz Twoja dystrybucja CloudFront powinna buforować różne odpowiedzi (z odpowiednimi nagłówkami CORS) dla różnych nagłówków Origin klienta.

KBH
źródło
1
To nie działa, czy masz więcej szczegółów? Włączyłem to, ale nadal mam dokładnie ten sam problem.
Jaco Pretorius
7

Jedyne, co mi się sprawdziło (prawdopodobnie dlatego, że miałem niespójności z użyciem www.):

Wklej to do swojego pliku .htaccess:

<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.theturninggate.net/doku.php?id=cross-domain_issues_broken_web_fonts

Luigi04
źródło
1
Niesamowite! Wielkie dzięki!
Rotimi
1
Ponieważ twój kod był szczegółowy, zajęło mi to trochę czasu, ale nauczyłem się kilku rzeczy. Część z tego wykorzystałem, aby ulepszyć moje rozwiązanie. Zadziałało.
Mohammed Moinuddin Waseem
3

Miałem ten sam problem i ten link zapewnił mi rozwiązanie:

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

Krótka wersja to:

  1. Edytuj konfigurację S3 CORS (mój przykładowy kod nie wyświetlał się poprawnie)
    Uwaga: zostało to już zrobione w pierwotnym pytaniu
    Uwaga: podany kod nie jest zbyt bezpieczny, więcej informacji na podlinkowanej stronie.
  2. Przejdź do karty „Zachowania” swojej dystrybucji i kliknij, aby edytować
  3. Zmień opcję „Przekaż nagłówki” z „Brak (poprawia buforowanie)” na „Biała lista”.
  4. Dodaj „Origin” do listy „Biała lista nagłówków”
  5. Zapisz zmiany

Twoja dystrybucja w chmurze zostanie zaktualizowana, co zajmie około 10 minut. Potem wszystko powinno być dobrze, możesz zweryfikować, sprawdzając, czy komunikaty o błędach związane z CORS zniknęły z przeglądarki.

agbodike
źródło
2

Dla osób używających produktów firmy Microsoft z plikiem web.config:

Połącz to z plikiem web.config.

Aby zezwolić na dowolnej domeny zastąpić value="domain"zvalue="*"

<?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>

Jeśli nie masz uprawnień do edycji pliku web.config, dodaj tę linię w kodzie po stronie serwera.

Response.AppendHeader("Access-Control-Allow-Origin", "domain");
nu everest
źródło
Zasługuje na głosowanie za zapamiętanie nas, użytkowników systemu Windows.
mohrtan
Używam asp.net core, jak dodać to do pliku appsettings.json?
Yusuff Sodiq
1

Jest miły writeup tutaj .

Konfiguracja tego w nginx / apache jest błędem.
Jeśli korzystasz z firmy hostingowej, nie możesz skonfigurować krawędzi.
Jeśli używasz platformy Docker, aplikacja powinna być samodzielna.

Zauważ, że niektóre przykłady używają, connectHandlersale to ustawia tylko nagłówki w dokumencie. Użycie rawConnectHandlersdotyczy wszystkich obsługiwanych zasobów (czcionki / css / itp.).

  // 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();
  });

To byłby dobry moment, aby przyjrzeć się zasadom przeglądarki, takim jak kadrowanie itp.

Michael Cole
źródło
0

Po prostu dodaj użycie źródła w swoim, jeśli używasz node.js jako serwera ...

lubię to

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

Potrzebujemy odpowiedzi na pochodzenie

Daksh Patel
źródło
-5

Rozwiązanie robocze dla Heroku jest tutaj http://kennethjiang.blogspot.com/2014/07/set-up-cors-in-cloudfront-for-custom.html (cytaty ):

Poniżej znajduje się dokładnie to, co możesz zrobić, jeśli używasz aplikacji Rails w Heroku i używasz Cloudfront jako CDN. Został przetestowany na Ruby 2.1 + Rails 4, Heroku Cedar.

Dodaj nagłówki HTTP CORS (Access-Control- *) do zasobów czcionek

  • Dodaj klejnot font_assetsdo Gemfile.
  • bundle install
  • Dodaj config.font_assets.origin = '*'do config/application.rb. Jeśli chcesz bardziej szczegółowej kontroli, możesz dodać różne wartości pochodzenia do różnych środowisk, np.config/config/environments/production.rb
  • curl -I http://localhost:3000/assets/your-custom-font.ttf
  • Prześlij kod do Heroku.

Skonfiguruj Cloudfront do przekazywania nagłówków HTTP CORS

W Cloudfront wybierz swoją dystrybucję, w zakładce "zachowanie" wybierz i edytuj wpis kontrolujący dostarczanie czcionek (dla większości prostych aplikacji Railsowych masz tylko 1 wpis). Zmień Forward Headers z „None” na „Whilelist”. I dodaj następujące nagłówki do białej listy:

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

Zapisz to i to wszystko!

Uwaga: odkryłem, że czasami Firefox nie odświeża czcionek, nawet jeśli zniknął błąd CORS. W takim przypadku odśwież stronę kilka razy, aby przekonać Firefoksa, że ​​jesteś naprawdę zdeterminowany.

mihserf
źródło
4
Unikaj odpowiedzi zawierających tylko łącza. Byłoby pomocne, gdybyś mógł skopiować odpowiednie fragmenty z połączonego artykułu do swojej odpowiedzi. Dzięki.
bPratik