Riassunto:
- La chiave della cache primaria per qualsiasi browser conforme agli standard è un URI assoluto
- L'URI assoluto inizia
http:
per tutte le richieste non sicure e https:
per tutte le richieste protette - Di conseguenza, una risorsa recuperata in modo sicuro non può mai utilizzare la stessa chiave di cache di una risorsa recuperata in modo non sicuro
L'attuale standard per HTTP è suddiviso in più documenti "RFC", con RFC 7234 interamente dedicato alla memorizzazione nella cache, poiché è coinvolta molta complessità.
Nella sezione 2, "Panoramica del funzionamento della cache", c'è questo riepilogo:
La chiave della cache primaria è costituita dal metodo di richiesta e dall'URI di destinazione. Tuttavia, poiché le cache HTTP di uso comune oggi sono tipicamente limitate alla memorizzazione nella cache delle risposte a GET, molte cache rifiutano semplicemente altri metodi e utilizzano solo l'URI come chiave della cache primaria.
Questo è più formalmente indicato nel primo punto dell'elenco nella sezione 4, che dice:
Quando viene presentata una richiesta, una cache NON DEVE riutilizzare una risposta memorizzata, a meno che [...] l'URI della richiesta effettiva presentata ( Sezione 5.5 della RFC7230) quella della corrispondenza della risposta memorizzata [...]
La sezione 5.5 della RFC 7230 inizia dicendo
Per un programma utente, l'URI della richiesta effettiva è l'URI di destinazione.
Un browser è un "agente utente", quindi questo è il caso che ci interessa qui. "Target URI" è definito nella sezione 5.1:
Un riferimento URI (Sezione 2.7) viene solitamente utilizzato come identificatore per la "risorsa di destinazione", che un utente l'agente si risolverebbe nella sua forma assoluta per ottenere l '"URI di destinazione". L'URI di destinazione esclude l'eventuale componente di frammento di riferimento, poiché gli identificatori di frammento sono riservati per l'elaborazione lato client (RFC3986, sezione 3.5).
La definizione generica di un URI è in RFC 3986 e le preoccupazioni specifiche per HTTP occupano tre pagine della RFC 7230. La parte più rilevante per i nostri scopi è RFC 3986 sezione 4.1 che definisce questa grammatica per gli URI assoluti:
absolute-URI = schema ":" hier-part ["?" query]
Fondamentalmente, nota che schema
è una parte obbligatoria di qualsiasi URI assoluto. Poiché gli URI HTTP utilizzano sempre lo schema http
e gli URI HTTPS utilizzano sempre lo schema https
, ciò significa che i loro URI assoluti, e quindi le loro "chiavi cache primarie" in un browser, non possono mai entrare in collisione.
Altre risposte hanno menzionato le porte. RFC 7230, sezione 2.7.1 definisce gli http
URI come includenti una sezione "authority", che è definita in [RFC 3986, sezione 3.2]:
authority = [userinfo "@"] host [":" port]
La porta è facoltativa, con RFC 7230, sezione 2.7.1 definizione del valore predefinito per lo schema URI http
:
Se il sottocomponente della porta è vuoto o non viene fornito, la porta TCP 80 (la porta riservata per i servizi WWW) è quella predefinita .
E la sezione seguente che definisce il valore predefinito per "https":
Tutti i requisiti sopra elencati per lo schema "http" sono anche requisiti per lo schema "https", tranne per il fatto che la porta TCP 443 è l'impostazione predefinita se il sottocomponente della porta è vuoto o non è specificato, e ...
Segue quindi che:
- Qualsiasi richiesta HTTP non sulla porta 80 deve includere un numero di porta nel suo URI assoluto
- Qualsiasi richiesta HTTPS non sulla porta 443 deve includere un numero di porta nel suo URI assoluto
- Nessuna delle due richieste con numeri di porta diversi specificati avrà la stessa chiave di cache, poiché avranno URI assoluti distinti
Quindi questi URI sarebbero tutti memorizzati nella cache separatamente :
L'unica cosa su cui non sono chiaro è se il browser debba, può o deve normalizzare gli URI che menzionare esplicitamente la porta che sarebbe comunque quella predefinita. In altre parole, indipendentemente dal fatto che questi due URI vengano memorizzati nella cache separatamente o meno:
Non riesco a pensare a nessuna conseguenza pratica di normalizzarli sulla stessa chiave di cache, perché dalle definizioni precedenti si garantisce che rappresentino la stessa risorsa.