Perché l '"ultima modifica" non è corretta su Google Cloud Platform App Engine?
Ho distribuito più volte il mio Web su Google Cloud Platform App Engine. Utilizzando l'impostazione come segue:
app.yaml
runtime: nodejs10
Tutto ha funzionato bene quando l'ho testato su localhost. Ma quando l'ho distribuito su Google Cloud Platform. L'intestazione della risposta è sempre visualizzata last-modified: Tue, 01 Jan 1980 00:00:01 GMT. Ho controllato [my-web].df.r.appspot.comper assicurarmi che il problema provenga da Google Cloud Platform.
Qualcuno ha un'idea?
Aggiornato 2020-10-07
Per chiunque abbia lo stesso problema, non esitate a partecipare alla discussione qui .
Risposte
Questo sembra essere un problema causato dalla cache. Per assicurarti che il nuovo index.html sia distribuito, dovresti eseguire "gcloud beta app deploy --no-cache", potrebbe essere necessario aggiungere campi aggiuntivi come app.yaml come menzionato qui . Ciò garantirebbe che il nuovo index.html associato alla tua versione venga inserito nel contenitore.
Stiamo riscontrando lo stesso problema che la versione precedente di index.html viene rilevata dai client dopo aver ridistribuito un'app standard di appengine. Questo problema sembrava iniziare a metà agosto. Inizialmente abbiamo scoperto che l'aggiunta di una riga al file HTML del client come: sembrava risolvere il problema. Ma questo non funziona più.
Ho avuto lo stesso problema del vecchio index.htmlessere servito. Il problema era con il etagche è stato generato. Anche se i file sono cambiati, sono etagrimasti gli stessi.
Ciò ha causato la pubblicazione del file dalla cache del browser con codice di stato 304. Il colpevole era il mio app.yamlfile, che era
runtime: nodejs10
Modificandolo al di sotto ha risolto il problema.
env: standard
runtime: nodejs10
default_expiration: '14d'
handlers:
- url: /static
static_dir: build/static
secure: always
- url: /(.*\.(json|ico))$ static_files: build/\1 upload: build/.*\.(json|ico)$
secure: always
- url: .*
static_files: build/index.html
upload: build/index.html
expiration: '5s'
secure: always
Apparentemente, questo è un comportamento in base alla progettazione poiché tutti i timestamp vengono azzerati durante la distribuzione dal motore dell'app. vedere:https://issuetracker.google.com/issues/168399701
Stavo inviando io stesso i file statici usando express. Quindi ho risolto il problema non impostando l'etichetta e le intestazioni dell'ultima modifica. Per esempio:
app.use("/", express.static(root, { etag: false, lastModified: false }));
O per singoli file:
app.get("/*", async (req, res) => {
return res.sendFile("index.html", { root, lastModified: false, etag: false });
});