Vra

Ek skryf'n hulpbron hantering metode waar ek beheer toegang tot verskeie lêers, en ek wil graag in staat wees om gebruik te maak van die blaaier se kas.My vraag is twee-ledig:

  1. Wat is die finaal HTTP headers dat ek nodig het om te kyk om te weet vir seker of ek moet stuur'n 304 reaksie, en wat is ek op soek vir wanneer ek dit doen gaan hulle?

  2. Daarbenewens, is daar enige kop-dat ek nodig het om te stuur wanneer ek aanvanklik stuur die lêer (soos "Laaste Wysiging') as'n 200 reaksie?

Sommige psuedo-kode sou waarskynlik die mees bruikbare antwoord nie.


Wat van die kas-beheer kop?Kan die verskillende moontlike waardes van wat'n invloed wat jy stuur na die kliënt (naamlik max-ouderdom) of moet slegs indien-verander-sedert gehoorsaam word?

Was dit nuttig?

Oplossing

Hier is hoe ek geïmplementeer nie. Die kode is besig om vir 'n bietjie meer as 'n jaar en met verskeie implementeer, so ek dink dit is redelik betroubaar. Dit is gebaseer op RFC 2616 en deur die waarneming van wat en wanneer die verskillende blaaiers is die stuur van.

Hier is die pseudokode:

server_etag = gen_etag_for_this_file(myfile)
etag_from_browser = get_header("Etag")

if etag_from_browser does not exist:
    etag_from_browser = get_header("If-None-Match")
if the browser has quoted the etag:
    strip the quotes (e.g. "foo" --> foo)

set server_etag into http header

if etag_from_browser matches server_etag
    send 304 return code to browser

Hier is 'n uittreksel van my bediener logika dat hierdie hanteer.

/* the client should set either Etag or If-None-Match */
/* some clients quote the parm, strip quotes if so    */
mketag(etag, &sb);

etagin = apr_table_get(r->headers_in, "Etag");
if (etagin == NULL)
    etagin = apr_table_get(r->headers_in, "If-None-Match");
if (etag != NULL && etag[0] == '"') {
    int sl; 
    sl = strlen(etag);
    memmove(etag, etag+1, sl+1);
    etag[sl-2] = 0;
    logit(2,"etag=:%s:",etag);
}   
... 
apr_table_add(r->headers_out, "ETag", etag);
... 
if (etagin != NULL && strcmp(etagin, etag) == 0) {
    /* if the etag matches, we return a 304 */
    rc = HTTP_NOT_MODIFIED;
}   

As jy wil 'n paar help met ETAG generasie post 'n ander vraag en ek sal grawe 'n paar kode wat doen wat as goed. HTH!

Ander wenke

'n 304 Nie Gewysig reaksie kan die gevolg wees van 'n AOO of HEAD-versoek met óf 'n As-verander-sedert ( "IMS") of 'n As-Nie-wedstryd ( "INM") header.

Ten einde te besluit wat om te doen wanneer jy hierdie hoofde ontvang, dink dat jy is die hantering van die AOO-versoek sonder hierdie voorwaardelike kop. Vas te stel wat die waardes van jou ETAG en laaste wysiging kop in daardie reaksie sou wees en dit gebruik om die besluit te neem. Hopelik het jy jou stelsel gebou sodanig dat die bepaling van hierdie is goedkoper as die bou van die volledige reaksie.

As daar 'n INM en die waarde van daardie kop is dieselfde as die waarde wat jy in die ETAG sou plaas, dan reageer met 304.

As daar 'n IMS en die datum waarde in daardie kop is later as die een wat jy in die laaste wysiging, dan reageer met 304 sou plaas.

Else, voortgaan asof die versoek nie diegene kop het bevat.

Vir 'n minder moeite benadering tot deel 2 van jou vraag, uit te vind wat van die (verstryk, ETAG, en laaste wysiging) headers jy kan maklik en korrek te produseer in jou Web aansoek.

Vir voorgestel leesstof:

http://www.w3.org/Protocols/rfc2616/rfc2616.html

http://www.mnot.net/cache_docs/

Jy moet stuur'n 304 indien die kliënt het uitdruklik gesê dat dit kan reeds die bladsy in sy kas.Dit is die sogenaamde'n voorwaardelike KRY, wat moet sluit in die as-verander-sedert kop in die versoek.

Basies, hierdie versoek kop bevat'n datum waarop die kliënt eise aan'n cached kopie.Jy moet kyk of die inhoud verander het na hierdie datum en stuur'n 304 as dit nie.

Sien http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.25 vir die verwante artikel in die RFC.

Ons is ook die hantering van die kas, maar verseker, hulpbronne.As jy stuur / genereer'n ETAg kop (wat RFC 2616 afdeling 13.3 beveel aan jy MOET), dan die kliënt MOET dit gebruik in'n voorwaardelike versoek (tipies in'n As-Een-Pas - HTTP_IF_NONE_MATCH - header).As jy stuur'n Laaste Wysiging kop (weer jy MOET), dan moet jy kyk die As-Verander-Sedert - HTTP_IF_MODIFIED_SINCE - kop.As jy stuur vir beide, dan is die kliënt MOET stuur beide, maar dit MOET stuur die ETag.Let ook daarop dat validtion is net gedefinieer as die beheer van die voorwaardelike kop vir gelykheid streng teen die mense wat jy wil stuur.Ook, slegs'n sterk validator (soos'n ETag) sal gebruik word vir gewissel versoeke (waar slegs'n deel van'n hulpbron is versoek).

In die praktyk, sedert die hulpbronne wat ons is die beskerming is redelik staties, en'n tweede een tydsverloop is aanvaarbaar, ons doen die volgende:

  1. Kyk om te sien as die gebruiker gemagtig is om toegang tot die versoek hulpbron

    Indien hulle nie is nie, Lei hulle of stuur'n 4xx reaksie soos toepaslik.Ons sal genereer 404 antwoorde op versoeke wat lyk soos hack pogings of blatante probeer om uit te voer'n sekuriteit einde loop.

  2. Vergelyk die As-Verander-Sedert kop om die Laaste Wysiging kop ons sou stuur (sien onder) vir'n streng gelykheid

    As hulle ooreenstem, stuur'n 304 het nie Verander Nie reaksie en uitgang bladsy verwerking

  3. Skep'n Laaste Wysiging kop met behulp van die verandering van die tyd van die versoek hulpbron

    Kyk op die HTTP Datum formaat in RFC 2616

  4. Stuur uit die kop en hulpbron-inhoud saam met'n toepaslike Inhoud-Tipe

Ons het besluit om te vermy die ETag kop, want dit is overkill vir ons doeleindes.Ek dink ons kan ook net gebruik om die datum, tyd stempel as'n ETag.As ons beweeg na'n ware ETag stelsel, sou ons waarskynlik winkel bereken allegaartjies vir die hulpbronne en die gebruik van diegene wat as ETags.

As jou hulpbronne is dinamies gegenereer word, uit sê databasis inhoud, dan ETags kan beter wees vir jou behoeftes, want hulle is net teks bevolk as jy sien pas.

met betrekking tot kas-beheer:

Jy moet nie bekommerd te wees oor die kas-beheer toe te dien nie, behalwe die opstel van dit 'n redelike waarde. Dit is basies vertel die leser en ander stroomaf entiteite (soos 'n proxy) die maksimum tyd wat moet verloop voordat tydsberekening uit die kas.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top