Podle osvědčených postupů Yahoo pro urychlení vašeho webu poskytujeme statický obsah z CDN pomocí záhlaví vypršení platnosti mezipaměti daleké budoucnosti. Samozřejmě musíme tyto „statické“ soubory občas aktualizovat, takže aktuálně přidáváme verzi infix jako součást názvu souboru (na základě součtu SHA1 obsahu souboru). Tím pádem:

styles.min.css 

Stává se:

styles.min.abcd1234.css 

Správa verzovaných souborů však může být zdlouhavá a já jsem přemýšlel, jestli notace argumentu GET může být čistší a lepší:

styles.min.css?v=abcd1234 

Které používáte a proč? Existují úvahy týkající se prohlížeče nebo proxy / cache, které bych měl zvážit?

  • Důvod, proč se ptám, je ten, že si zřejmě pamatuji, že jsem slyšel důvod NEPOUŽÍVAT styl argumentu GET, ale nepamatuji si proč.
  • Nevyžaduje použití argumentu GET obsluhu šablony stylů s nějakým druhem skriptu na straně serveru (a už by to nebylo statické)?
  • @Lotus: Můžete poslat argumenty GET a budou tiše ignorovány, pokud je nic nehledá.

Podle Google Make the Web Faster nejsou stránky s parametry dotazu ukládány do paměti mnoha proxy serverů HTTP.

Většina proxy serverů, zejména Squid up od verze 3.0, neukládá prostředky do mezipaměti znakem „?“ v jejich URL, i když a Cache-control: public v odpovědi je záhlaví. Chcete-li pro tyto prostředky povolit ukládání do mezipaměti proxy, odeberte řetězce dotazů z odkazů na statické prostředky a místo toho zakódujte parametry do samotných názvů souborů.

Tak styles.min.abcd1234.css je upřednostňovaným řešením. K otočení můžete použít vhodný mechanismus přepisování adres URL styles.min.abcd1234.css do jednodušší implementace styles.min.css?v=abcd1234 transparentně.

Pokud podporujete pouze protokol HTTPS, tato rada se nepoužije, protože servery proxy obvykle nemohou ukládat stránky do mezipaměti poskytované přes SSL.

  • 3 Zajímalo by mě, jestli jsou informace týkající se ukládání řetězců dotazů do mezipaměti a proxy serverů trochu zastaralé? Dokumenty Google již v této souvislosti neodkazují na řetězce dotazů a proxy servery. Ačkoli příklady stále zahrnují změnu samotného názvu souboru. Squid 2.7 (2008) a 3.1 (2010) údajně ve výchozím nastavení podporují ukládání řetězců dotazů do mezipaměti a dřívější verze lze nakonfigurovat tak, aby to podporovaly.

Pomocí verzí ve stylu GET z prázdné mezipaměti více adres URL - např. style.css?v=123 a style.css?v=456 - vrátí stejný obsah. Nevidím však, že by to bylo problematické, zejména proto, že byste odkazovali pouze na jeden po druhém.

Myslím, že se vám styl GET bude mnohem snadněji udržovat. Nepotřebujete samostatné soubory: stačí změnit adresu URL a prohlížeče načtou CSS znovu.

UPDATE: při dalším výzkumu se zdá, že použití řetězce dotazu může zastavit prohlížeče ukládající soubory do mezipaměti. Pokud však vracíte správné záhlaví, jako je Expires to není problém.

UPDATE 2: přijatá odpověď poukazuje na to, že někteří proxy neukládají soubory do mezipaměti pomocí řetězce dotazu. Toto je však založeno na starých informacích; konkrétní problém, který zmiňují v Squid, byl opraven před 7 lety. Působivé weby se o tom dobře napsaly.

  • To je výhrada, kterou jsem se snažil zapamatovat. Díky za odkaz.
  • Jednosměrné řetězce dotazů jsou problematické: na serveru existuje pouze jeden soubor, ale jakýkoli řetězec dotazu je jiná adresa URL. Používáte verzování, když používáte mezipaměti, a protože každá nová verze má být neměnná, budete používat extrémně dlouhé mezipaměti. Pokud používáte reverzní proxy, je možné (i když nepravděpodobné), že někdo zaútočí na váš server ZÍSKÁM verzi, kterou jste dosud nevytvořili. Např. máte pouze style.css? v = 3, ale někdo ZÍSKÁ style.css? v = 4. Nyní je tento soubor uložen do mezipaměti v reverzním serveru proxy. Když nahrajete 4. verzi, proxy server bude obsluhovat třetí, kterou dříve ukládal do mezipaměti.
  • @OdraEncoded Jako řetězec dotazu můžete vždy použít hash souboru, pak není možné uhodnout, jaká bude další verze. Nebo vyprší platnost nového řetězce dotazu během procesu sestavení.
  • Pokud používáte hashe, pravděpodobně se to nikdy nestane, ale není to matematicky nemožné, a zneplatnění mezipaměti reverzní proxy přidává projektu složitost. Imho, nejbezpečnější způsob, jak to udělat, je jednoduše vrátit 404, když je požadována neexistující verze. Neexistuje žádný důvod, aby se nejnovější verze uložená na serveru vrátila při nasazení (i když to možná má na vývojovém serveru smysl), takže nejjednodušším řešením je použít verze spíše v názvech souborů než v řetězcích dotazů.

Oba budou fungovat stejně dobře, protože řetězec dotazu je považován za součást adresy URL a jeho změnou ve skutečnosti změníte název zdroje, což způsobí, že prohlížeč načte novou kopii souboru.

Říkám, že použijete jakoukoli metodu, která je pro vás snadnější udržovat.

Pracoval pro vás: Charles Robertson | Chcete nás kontaktovat?