2010-06-11 9 views
6

Próbuję dowiedzieć się, czy mogę pobrać przeglądarki do buforowania obrazów z podpisanymi adresami URL.Buforowanie obrazów z różnymi ciągami zapytań (adresy URL podpisane przez S3)

Potrzebne jest wygenerowanie nowego podpisanego adresu URL dla każdego żądania (ten sam obraz, ale z zaktualizowanym podpisem), ale niech przeglądarka nie będzie go ponownie pobierać za każdym razem.

Zakładając, że nagłówki związane z pamięcią podręczną są ustawione prawidłowo, a cały adres URL jest taki sam, z wyjątkiem ciągu zapytania, czy istnieje sposób, aby uczynić go przeglądarką w pamięci podręcznej?

Adresy URL będzie wyglądać następująco:

http://example.s3.amazonaws.com/magic.jpg?WSAccessKeyId=stuff&Signature=stuff&Expires=1276297463 
http://example.s3.amazonaws.com/magic.jpg?WSAccessKeyId=stuff&Signature=stuff&Expires=1276297500 

Planujemy ustawić e-tagów być md5sum, więc będzie to przynajmniej dowiedzieć się, że to ten sam obraz w tym momencie?

Moją inną opcją jest śledzenie, kiedy ostatnio wydano adres URL, a następnie zacznij podawać nowe nieco przed wygaśnięciem starych, ale wolałbym nie zajmować się informacjami o sesji.

Odpowiedz

4

Przeglądarka będzie używać całego adresu URL do celów buforowania, w tym parametrów żądania. Jeśli więc zmienisz parametr żądania, będzie on faktycznie nowym "kluczem" w pamięci podręcznej i zawsze pobierze nową kopię tego obrazu. Jest to popularna technika w świecie wyświetlania reklam - dodajesz losową liczbę (lub bieżący znacznik czasu) na końcu adresu URL jako parametr, aby zapewnić, że przeglądarka zawsze wraca na serwer, aby wysłać nowe żądanie.

Jedynym sposobem, w jaki możesz to zrobić, jest możliwość ustawienia adresu URL jako statycznego - np. Za pomocą reguł przepisywania Apache lub pewnego rodzaju proxy.

+0

Czy wiesz, że przynajmniej sprawdzi tag e-tag i nie pobierze go ponownie? –

+0

Nagłówek ETag jest wysyłany przez przeglądarkę do serwera tylko wtedy, gdy znajdzie plik w jego pamięci podręcznej (i jeśli oryginalny plik miał wartość ETag). Więc jeśli nie może go znaleźć w pamięci podręcznej (której nie będzie, jeśli adres URL się zmienił), nie ma żadnej wartości ETag, aby wysłać żądanie. –

+1

Reguła przepisywania adresów URL ponownie uczyniłaby podpis S3 bezużytecznym, ponieważ serwer WWW automatycznie zapewniałby link, który nie wygasł. Następnie możesz również oznaczyć pliki w S3 jako "publiczne". (Następnie, aby uzyskać dostęp do plików, nie jest wymagany podpis) – Tarnschaf

3

Mam dokładnie taki sam problem z podpisanymi adresami URL S3. Jedynym rozwiązaniem, które wymyśliłem, to wygaśnięcie adresów URL tego samego dnia. To nie jest idealne, ale przynajmniej zapewni buforowanie przez pewien czas.

Na przykład we wszystkich adresach URL podpisanych w kwietniu ustawię datę wygaśnięcia 10 maja. Wszystkie adresy URL podpisane w czerwcu wygasną 10 lipca. Oznacza to, że podpisane adresy URL będą identyczne dla całego miesiąca.

1

Natknąłem się na ten problem i znalazłem sposób na jego rozwiązanie. Oto, co musisz zrobić:

  1. Zapisz pierwszy ciąg URL (na przykład w przypadku localStorage);
  2. Po otrzymaniu adresu URL IMG następnym razem po prostu sprawdzić, czy ich głównym URL mecz (str1.split('?')[0] === str2.split('?')[0])
  3. Jeśli tak, użyj jako pierwszy img src atrybutu.

Mam nadzieję, że komuś pomaga.

Powiązane problemy