Serversvar 304 Not Modified
HTTP-statuskod 304 (Not Modified)
HTTP-statuskod 304 (Not Modified) används av webbservrar för att indikera att en begärd resurs inte har ändrats sedan den senaste begäran från klienten. Detta meddelande är en del av mekanismen för cachelagring, vilket förbättrar prestandan och minskar bandbreddsanvändningen genom att förhindra överföring av oförändrad data.
Huvudsakliga egenskaper hos statuskod 304
- Definition och syfte: Statuskod 304 signalerar att den begärda resursen är oförändrad och att klienten kan använda den cachelagrade versionen.
- Så fungerar cachelagringsmekanismen med 304: När en klient begär en resurs, kan den skicka med specifika rubriker som indikerar när den senast hämtade resursen. Om servern bedömer att resursen inte har ändrats, returnerar den statuskod 304.
- Villkor när servern returnerar status 304: Servern returnerar denna statuskod när den får rubriker som
If-Modified-Since
ellerIf-None-Match
och resursens innehåll är oförändrat sedan det angivna datumet eller ETag-värdet.
Praktiska exempel på användning av statuskod 304
Exempel med cachelagring av bilder på en webbplats
- Hur webbläsaren sparar cache: När en bild laddas första gången, sparas den i webbläsarens cache tillsammans med metadata om den senaste ändringen.
- beteende vid upprepade begärningar: Vid nästa begäran om samma bild, skickar webbläsaren en begäran med
If-Modified-Since
. Om bilden inte har ändrats, returnerar servern statuskod 304.
Exempel med API
Statuskod 304 kan också användas för att optimera begärningar till en API-resurs. Genom att implementera cachelagring kan API:et minska belastningen på servern och förbättra svarstiderna.
Exempel med rubriker If-Modified-Since och If-None-Match
Dessa rubriker spelar en avgörande roll i kommunikationen mellan klient och server. If-Modified-Since
används för att begära resurser som har ändrats efter ett visst datum, medan If-None-Match
används för att jämföra med en specifik ETag. Om resursen inte har ändrats, svarar servern med statuskod 304.
Så här åtgärdar du problem med statuskod 304 på olika programmeringsspråk
PHP
För att korrekt ställa in rubriker för cachelagring i PHP, bör du använda följande kod:
header("Cache-Control: max-age=3600");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
if (strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) == strtotime($last_modified_time)) {
header("HTTP/1.1 304 Not Modified");
exit();
}
Python (Flask)
I Flask kan du konfigurera cachelagring och hantera statuskod 304 med följande kod:
from flask import Flask, request, make_response
app = Flask(__name__)
@app.route('/resource')
def resource():
last_modified_time = 'Wed, 21 Oct 2015 07:28:00 GMT'
response = make_response("Your resource data")
response.headers['Last-Modified'] = last_modified_time
if request.headers.get('If-Modified-Since') == last_modified_time:
response.status_code = 304
return response
return response
Node.js (Express)
I Express kan du hantera begärningar med statuskod 304 så här:
const express = require('express');
const app = express();
app.get('/resource', (req, res) => {
const lastModified = new Date('2023-10-01T10:00:00Z').toUTCString();
res.setHeader('Last-Modified', lastModified);
if (req.headers['if-modified-since'] === lastModified) {
res.status(304).send();
} else {
res.send("Your resource data");
}
});
Vanliga fel och hur man åtgärdar dem
- Felaktig konfiguration av cachelagring på servern: Kontrollera serverinställningarna för att säkerställa att cachelagring är korrekt konfigurerad.
- Fel i begärans rubriker: Se till att rubriker som
If-Modified-Since
ochIf-None-Match
är korrekt formaterade och skickas med varje begäran. - Så här kontrollerar och felsöker du statuskod 304: Använd verktyg för nätverksövervakning för att granska HTTP-begärningar och svar. Kontrollera att rätt rubriker skickas och att servern svarar som förväntat.
Språk | Exempel på kod |
---|---|
PHP | header("HTTP/1.1 304 Not Modified"); |
Python | response.status_code = 304; |
Node.js | res.status(304).send(); |