Na IE CSS font-face działa tylko podczas poruszania się po wewnętrznych linkach

Nasz webdesigner stworzył CSS z następującym font-face:

@font-face {
    font-family: 'oxygenregular';
    src: url('oxygen-regular-webfont.eot');
    src: url('oxygen-regular-webfont.eot?#iefix') format('embedded-opentype'),
         url('oxygen-regular-webfont.woff') format('woff'),
         url('oxygen-regular-webfont.ttf') format('truetype'),
         url('oxygen-regular-webfont.svg#oxygenregular') format('svg');
    font-weight: normal;
    font-style: normal;
}

Działa dobrze na IE i Firefixie. Ale jest problem: na IE czcionki są renderowane poprawnie tylko wtedy, gdy poruszam się po stronie za pomocą wewnętrznych linków do stron internetowych. Jeśli nacisnę przycisk Odśwież lub wstecz, czcionki zostaną zastąpione domyślną czcionką (Times New Roman).

Obecnie strona używa HTTPS, ale ten sam problem zaobserwowano podczas korzystania z HTTP.

Kiedy poruszam się za pomocą wewnętrznych linków na stronie, w Karta sieciowa IE Developer tools (Shift - F12), widzę, co następuje:

/Content/oxygen-regular-webfont.eot?    GET 200 application/vnd.ms-fontobject

Kiedy używam przycisków Refresh/Back, są jeszcze dwa wpisy dla innych czcionek:

/Content/oxygen-regular-webfont.woff    GET 200 application/x-font-woff
/Content/oxygen-regular-webfont.ttf GET 200 application/octet-stream

Sam plik CSS jest ładowany w następujący sposób:

/Content/site.css   GET 200 text/css

Próbowałem usunąć zarówno woff jak i ttf więc miałem:

@font-face {
    font-family: 'oxygenregular';
    src: url('oxygen-regular-webfont.eot');
    src: url('oxygen-regular-webfont.eot?#iefix') format('embedded-opentype');
    font-weight: normal;
    font-style: normal;
}

Ale i tak IE zachowuje się tak samo (tyle że nie pobiera już woffa i ttf): wyświetla niepoprawne czcionki awaryjne podczas przechodzenia przez Wstecz / Odśwież.

Jak sprawić, by IE ładowało poprawne czcionki przy akcjach odświeżania / cofania?

Author: JustAMartin, 2012-11-16

8 answers

Znalazłem rozwiązanie, ale nie widzę powodu, dla którego to działa (cóż, tylko jeden powód-to IE: D).

To, co zrobiłem, to umieścić tę samą stronę na Apache i przetestować ponownie. Na Apache czcionki działały dobrze nawet przy użyciu przycisku odświeżania. Potem w Inspektorze sieci zobaczyłem, że Apache zwraca 304 zamiast 200 dla pliku eot i to mnie uderzyło - więc to problem z buforowaniem. Poszedłem do mojego ASP.NET aplikacji i oczywiście - ze względów bezpieczeństwa (a także aby uniknąć buforowania żądań AJAX) ktoś miał wyłączenie każdego buforowania, jakie można sobie wyobrazić:

        // prevent caching for security reasons
        HttpContext.Current.Response.Cache.SetAllowResponseInBrowserHistory(false);
        HttpContext.Current.Response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1));
        HttpContext.Current.Response.Cache.SetValidUntilExpires(false);
        HttpContext.Current.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
        HttpContext.Current.Response.Cache.SetNoServerCaching();

        // do not use any of the following two - they break CSS fonts on IE
        HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);
        HttpContext.Current.Response.Cache.SetNoStore();

Jak tylko skomentowałem dwie ostatnie linijki kodu, nagle fonty zaczęły działać bez problemów na IE. Więc myślę, że odpowiedź brzmi: IE nie może załadować czcionki, jeśli nie jest buforowana. Nie mam pojęcia, dlaczego problem występuje tylko podczas odświeżania / nawigowania z powrotem.

Edit-alternatywne rozwiązanie

Zamiast komentować te dwie ostatnie linijki

    // do not use any of the following two - they break CSS fonts on IE
    HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);
    HttpContext.Current.Response.Cache.SetNoStore();

Zmień SetAllowResponseInBrowserHistory na true zamiast:

HttpContext.Current.Response.Cache.SetAllowResponseInBrowserHistory(true);

Powinno to nadal pozwalać na brak pamięci podręcznej, z wyjątkiem nawigacji do tyłu i do przodu, jak to Rozumiem. MSDN - SetAllowResponseInBrowserHistory Method

 21
Author: JustAMartin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-18 11:28:36

Miałem do czynienia z tym samym problemem.

W przypadku gdy nagłówek .plik eot zawiera Cache-Control: no-cache wartość, IE9 nie ładuje poprawnie czcionki. Pokazane narzędzia DevWynik - 200, ale kolumna otrzymane pokazano 400B, w tym samym czasie Content-Length było 70Kb. Użyłem następującej wartości Cache-Control: max-age=0, aby rozwiązać problem.

 14
Author: Alexandr Skachkov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-12 21:33:16

Właśnie miałem ten sam błąd, a dla tych, którzy chcą mieć czyste rozwiązanie (niezwiązane z dokładną technologią): musisz upewnić się, że nagłówki czcionek, które wysyłasz, nie mówią no-cache. Oprócz tego, co zostało napisane wcześniej, istnieją w rzeczywistości dwa nagłówki, które mogą to zrobić:

"cache-control: no-cache"

I

"pragma: no-cache"

Oba mówią, że przeglądarka jest taka sama, pierwsza jest częścią HTTP1.1, druga jest starsza (HTTP1.0).

Teraz rozwiązania:

  • jeśli naprawdę chcesz serwować czcionki (i inne pliki?) bez buforowanie po stronie klienta, set "cache-control" to "max-age=0"; możesz upuścić nagłówek pragma, jest przestarzały(lub ustawić go na "pragma: cache").
  • jeśli chcesz mieć buforowanie: Usuń wartości no-cache i ustaw właściwy max-age (np. "cache-control: max-age=3600" - one hour cache). Pragma może być ustawiona na "pragma: cache" lub całkowicie usunięta.
 6
Author: Michal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-17 11:04:08

Znalazłem alternatywne rozwiązanie, aby rozwiązać ten problem.

Umieściłem czcionkę bezpośrednio w arkuszu stylów, zamiast ładować ją jako osobny plik czcionki. Działa to absolutnie dobrze we wszystkich przeglądarkach, w tym Windows, Mac, IOS, Android itp., a także pomaga zmniejszyć liczbę żądań HTTP na stronie internetowej.

Nie będzie to wymagało żadnej zmiany w header Cache-Control.

@font-face { font-family: '<FONT NAME>'; src: url(data:application/x-font-woff;charset=utf-8;base64,<BASE64_ENCODED>) format('woff'), url(data:application/x-font-ttf;charset=utf-8;base64,,<BASE64_ENCODED>) format('truetype'); font-weight: normal; font-style: normal; }

Możesz użyć wbudowanego polecenia base64 w systemie OS X lub Linux do kodowania czcionek.

 4
Author: Selvan K,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-03 15:07:31

Odpowiedź JustAMartin doprowadziła nas do innego rozwiązania:

Zamiast komentować dwie ostatnie linijki

    // do not use any of the following two - they break CSS fonts on IE
    HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);
    HttpContext.Current.Response.Cache.SetNoStore();

Dodaliśmy następujący wiersz:

HttpContext.Current.Response.Cache.SetAllowResponseInBrowserHistory(true);

Powinno to nadal pozwalać na brak pamięci podręcznej, z wyjątkiem nawigacji do tyłu i do przodu, jak to Rozumiem. MSDN-SetAllowResponseInBrowserHistory Method

 3
Author: Aldracor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:00

Usunięcie globalnych ustawień odpowiedzi NoCache i NoStore naprawi czcionki, ale jeśli potrzebujesz tych ustawień, to oczywiście nie jest to odpowiedź.

Rozumiem, że tylko ustawienie pamięci podręcznej na expired nie będzie konsekwentnie uniemożliwiać wyświetlanie stron w pamięci podręcznej; wymusza sprawdzenie na serwerze, ale jeśli strona nie zostanie zmodyfikowana (odpowiedź 304) może (Zwykle?) nadal wyświetla buforowaną wersję.

(właściwie czytając to teraz przyszło mi do głowy, że ustawianie pamięci podręcznej klienta aby natychmiast wygasnąć w połączeniu z SetNoServerCaching może wymusić na stronie klienta, aby zawsze odnawiać? Wydaje się jednak, że może to mieć wpływ na wydajność.)

Znalazłem, że w ASP.NET MVC używanie atrybutu OutputCacheAttribute na kontrolerze w celu wyłączenia buforowania nie powoduje złamania czcionek IE.

[OutputCacheAttribute(VaryByParam = "*", Duration = 0, NoStore = true)]
public class FooController : Controller
{
    ...
}    

Zdaję sobie sprawę, że NoStore nie jest tym samym co SetCacheability (HttpCacheability.NoCache), ale wydaje się działać w tym celu.

Można utworzyć kontroler bazowy z atrybut do dziedziczenia, aby Kod był czystszy.

 2
Author: Darren Rogers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-07 23:58:03

Upewnij się, że nie jest to problem ze ścieżką, tzn. plik CSS jest względny do miejsca, w którym znajdują się czcionki. W Twoim przypadku plik CSS musi znajdować się w tym samym folderze co Pliki Czcionek.

 1
Author: jimmy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-16 10:56:36

Nie ustawiaj nagłówka żądania Vary na https

Brak wczytywania czcionek

Vary:Accept-Encoding,https

Prace

Vary:Accept-Encoding

Ustawienie nagłówka pamięci podręcznej jest konieczne, aby uniknąć opóźnionego ładowania czcionki.

 1
Author: Matthias M,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-02 07:13:06