2014-07-03 31 views
23

Expressjs automatycznie wysyła etagi. Chciałbym wiedzieć, jak generowany jest etag. Jest oparty na zawartości generowanej dynamicznie przez procedurę pobierania. lub czy istnieje sposób, w jaki mogę go obsadzić, nawet nie przechodząc przez proces generowania treści (zawartość dynamiczna - od DB) i odsyłać etag jako taki sam.jak działa etag w expressjs

może być oprogramowaniem pośredniczącym, które rozpoczyna się od sprawdzenia, czy jest to poprawny identyfikator sesji i przekazuje ten sam etag, który klient podaje lub może być oparty na identyfikatorze URL + sesja ... w ten sposób będzie unikalny. i zakończyć tam żądanie zamiast przechodzenia przez całe wywołanie db i wszystkie te rzeczy. w takim przypadku musiałbym wiedzieć, że klient wykonuje wywołanie 304.

Mogę iść z tagiem expires.but, gdy sesja się skończy. jeśli ktoś otwiera adres URL, nie powinien na to pozwolić. więc myślę, że etag powinien również opierać się na identyfikatorze sesji. w jaki sposób modyfikacja może działać w tym dynamicznym scenariuszu zawartości. czy można go użyć.

+0

Czy możesz wyjaśnić swoje drugie i trzecie akapity? Byłoby dobrze, aby uzyskać więcej szczegółów na temat konkretnego problemu. – stellarchariot

Odpowiedz

23

W momencie pisania (8 lipca 2014 r.) Słaby ETag są generowane przy użyciu CRC32 (source), a silne ETag są generowane przy użyciu MD5 (source).

Based on what one of the contributors to Express says, można określić, czy należy używać silnych lub słabych Etags przez:

app.enable('etag') // use strong etags 
app.set('etag', 'strong') // same 
app.set('etag', 'weak') // weak etags 

Wygląda na to, można również określić własną funkcję niestandardową robić Etags tak:

app.set('etag', function(body, encoding){ /* return valid etag */ }); 

Warto również zapoznać się z pakietem NPM fresh, ponieważ jest używany w Express do sprawdzania świeżości (source1, source2).

Co do aplikacji, pamiętaj, że możesz zastąpić wszystkie nagłówki odpowiedzi, np. res.set('etag', 'my-awesome-etag-value') przed wywołaniem res.send() (lub podobną funkcją). Dalsza dyskusja (w tym wady i zalety) można znaleźć tutaj: https://github.com/visionmedia/express/issues/2129#issue-34053148

+8

Chciałbym zaznaczyć, że zgodnie z 4.X [docs] (http://expressjs.com/api.html#app.set), domyślny typ etag jest "słaby" przy włączaniu etagów. Aktualizacja – bakavic

+2

: Generowanie ETag odbywa się za pomocą modułu [jshttp/etag] (https://github.com/jshttp/etag). Wersja 1.7 (2015-06-08) zawsze używa MD5 zamiast CRC32, ponieważ CRC32 jest podatny na kolizje. Następna wersja zawsze będzie używać SHA1 zamiast MD5, ponieważ MD5 nie jest zgodny z FIPS. Ostatecznie, jedyną rzeczą "słabą" jest ustawienie przedrostka "W /" na ETag. Podczas gdy domyślnie express to "W /", jest to technicznie silny ETag, ponieważ hash jest obliczany na podstawie bajtów ciała, w przeciwieństwie do treści semantycznej. Jeśli jesteś w stanie zaimplementować słabe kalkulacje ETag dla swojej aplikacji, jest to potencjalnie duża poprawa. – ZachB

3

Od wyraźnej 4.x domyślny typ etag jest słaby

https://expressjs.com/en/api.html#etag.options.table

app.enable('etag') // use weak etags 
app.set('etag', 'weak') // use weak etags also 
app.set('etag', 'strong') // use strong etags 

// custom etag generation 
app.set('etag', function (body, encoding) { 
    return generateHash(body, encoding); // consider the function is defined 
});