Note to self: statyczny backup RESTowego serwisu WWW
Właśnie (jakoś od czternastej rano) przygotowuję raport na projekt zespołowy dla mojej kochanej uczelni. Od paru dni zastanawiałem się, jak do tego raportu dołączyć statyczną kopię Trac, którego używaliśmy do organizacji pracy. I nie żeby taka kopia to była moja nadgorliwość, prowadzący przedmiot sobie tego zażyczył.
Problem z tym jest podwójny. Po pierwsze, trac ma miłe RESTowe adresy nie kończące się na .html. Z tego powodu mirror strony ściągnięty bezpośrednio na dysk (wget -m adres) będzie później trudno otworzyć lokalnie. Z pomocą przychodzą dwie opcje wgeta:
- -E
- dodaje końcówkę .html do ściągniętych plików typu text/html, które tej końcówki nie mają w adresie
- -k
- Zamienia linki w ściągniętych plikach HTML tak, żeby lokalna kopia działała
Ale to tylko połowa problemów. Druga polega na tym, że oprócz ładnych RESTowych adresów strona rozgałęzia się w tysiące różnych zapytań GET, które zawierają różne warianty widoku. Jak zapuściłem ściąganie z tymi dwoma parametrami, po trzech godzinach działania i ponad 250 przeciągniętych megabajtach prawie samego tekstu dałem sobie spokój. Tylko jak powiedzieć wgetowi, żeby nie ściągał wszystkiego, co ma jakikolwiek znak zapytania?
Samemu wgetowi się nie da. Po prostu nie da. Tak czy inaczej będzie ściągał cały HTML, może go później skasuje (nie miałem na tyle cierpliwości, żeby sprawdzić). Odpada. Może z drugiej strony... ale nie tylko nie da się wgetowi podać lokalnego pliku robots.txt, ale też i w samym robots.txt nie da się zabronić dostępu do samych ścieżek z łańcuchem zapytania.
Nie byłoby jednak sensu pisać o tym publicznie, gdybym nie miał jakiejś formy rozwiązania. Do tego jest to rozwiązanie na tyle od dupy strony, że stwierdziłem, że warto je umieścić tutaj. Otóż, na serwerze, na którym działa ów trac, działa też mod_rewrite. Dopisałem szybko do .htaccess:
RewriteCond %{HTTP_USER_AGENT} ^Wget/ # Tylko dla naszego ściągania kopii, przeglądarki niech mają dostęp do wszystkiego
RewriteCond %{QUERY_STRING} !="" # Dla niepustego łańcucha zapytania
RewriteRule .* /drzewo [G] # Kierujemy na drzewo (G oznacza kod 410 Gone)
Wydaje się działać, co ku pamięci niniejszem odnotowuję.

Właściwym rozwiązaniem polecanym przez doktora dobrodzieja są dwa uderzenia cluebatem i jedno wieczorem, terapię stosować w czasie trwania roku akademickiego.
Statyczna kopia dynamicznej strony? WTF?
21 stycznia 2008 o 01:04:39
W ramach raportu z tego, co zrobiliśmy. Snapshot taki, żeby można było oglądać offline i odłożyć do akt, żeby mieć podkładkę do wystawionej oceny (i żebyśmy nie powystawiali i pozamykali wstecznie setki bugów, żeby przez najbliższe dwa tygodnie argumentować, że chcemy lepszą ocenę). Zasadniczo swój sens ma.
21 stycznia 2008 o 01:13:35
Alternatywnie można by było użyć httracka. Swego czasu używałem go z powodzeniem do utrzymywania lokalnych mirrorów różnych witryn :)
21 stycznia 2008 o 07:16:03
Ja bym zrobił, co prowadzący chciał. Bez końcówek .html. 250M? mało, niech się naciągnie 4.3G i na DVD wypalić. ;-)
…no chyba, że bardzo lubisz prowadzącego. :^)
21 stycznia 2008 o 10:39:02
Ale to MI się nie chce tego przeciągać i wypalać :]
21 stycznia 2008 o 10:47:50