まずは画像を適当に用意する。
http://i1303.photobucket.com/albums/ag159/arai_unmht/x_zps7cd4edca.jpg
このファイルを以下のようなリクエストで取得しようとすると
GET /albums/ag159/arai_unmht/x_zps7cd4edca.jpg HTTP/1.1 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:21.0) Gecko/20100101 Firefox/21.0 Host: i1303.photobucket.com Accept: text/html Connection: close
HTTP/1.1 302 Moved Temporarily Content-Length: 210 Content-Type: text/html Location: http://s1303.photobucket.com/albums/ag159/arai_unmht/x_zps7cd4edca.jpg Server: Footprint Distributor V4.8 Date: Mon, 06 May 2013 01:01:32 GMT Connection: close
おや、何か転送されたよ?
GET /albums/ag159/arai_unmht/x_zps7cd4edca.jpg HTTP/1.1 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:21.0) Gecko/20100101 Firefox/21.0 Host: s1303.photobucket.com Accept: text/html Connection: close
HTTP/1.1 302 Found Date: Mon, 06 May 2013 01:02:15 GMT Server: Apache Location: http://s1303.beta.photobucket.com/user/arai_unmht/media/x_zps7cd4edca.jpg.html Content-Length: 262 Connection: close Content-Type: text/html; charset=iso-8859-1
まだ転送される
GET /user/arai_unmht/media/x_zps7cd4edca.jpg.html HTTP/1.1 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:21.0) Gecko/20100101 Firefox/21.0 Host: s1303.beta.photobucket.com Accept: text/html Connection: close
HTTP/1.1 301 Moved Permanently Date: Mon, 06 May 2013 01:03:23 GMT Server: Apache Location: http://s1303.photobucket.com/user/arai_unmht/media/x_zps7cd4edca.jpg.html Content-Length: 281 Connection: close Content-Type: text/html; charset=iso-8859-1
まだまだ転送される
GET /user/arai_unmht/media/x_zps7cd4edca.jpg.html HTTP/1.1 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:21.0) Gecko/20100101 Firefox/21.0 Host: s1303.photobucket.com Accept: text/html Connection: close
HTTP/1.1 200 OK Date: Mon, 06 May 2013 01:04:08 GMT Server: Apache Set-Cookie: *** Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache Set-Cookie: *** Set-Cookie: *** Set-Cookie: *** Cache-Control: no-cache Vary: User-Agent Connection: close Transfer-Encoding: chunked Content-Type: text/html; charset=utf8
という長いやりとりの末に HTML ファイルが返ってくる。
一方、以下のようなリクエストで取得しようとすると
GET /albums/ag159/arai_unmht/x_zps7cd4edca.jpg HTTP/1.1 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:21.0) Gecko/20100101 Firefox/21.0 Host: i1303.photobucket.com Accept: */* Connection: close
HTTP/1.1 200 OK Cache-Control: max-age=21600 Content-Length: 36143 Content-Type: image/jpeg ETag: "8d2f-4dc023456ed40" Expires: Mon, 06 May 2013 07:07:32 GMT Last-Modified: Mon, 06 May 2013 00:58:53 GMT Accept-Ranges: bytes Server: nginx Access-Control-Allow-Origin: * X-Cache-Status: HIT X-Forwarded-Server: phx1ws062 X-PB-Link: TRUE Date: Mon, 06 May 2013 01:07:32 GMT Connection: close
あっさり画像が返ってくる。
早い話が、Accept フィールドの値によって返すファイルを変えているって事なんだけど、UnMHT ではそういう点を考慮してなかったので状況によっては間違ったファイルを保存しちゃう。
なので Ver.6.3.0b8 で修正。
その修正に伴ってリリース日も 5 月 10 日に延ばす。
それはそうと、この問題別に UnMHT だけで発生するわけじゃなくて
http://i1303.photobucket.com/albums/ag159/arai_unmht/x_zps7cd4edca.jpg
っていう URL をどういう形で開くかによって結果が変わっちゃうという問題でもある。
たとえばキャッシュが無い状態で、新しいタブを開いてからこの URL を開くと、以下のアルバムのページが表示される (Accept: text/html みたいのが送られる)。
http://s1303.photobucket.com/user/arai_unmht/media/x_zps7cd4edca.jpg.html
ところが、アルバムのページでは再度
http://i1303.photobucket.com/albums/ag159/arai_unmht/x_zps7cd4edca.jpg
を画像として表示する (Accept: image/* みたいのが送られる)。
結果、このアドレスに対して画像がキャッシュされる。
次に新しいタブを開いてから
http://i1303.photobucket.com/albums/ag159/arai_unmht/x_zps7cd4edca.jpg
こっちの URL を開くと画像が表示される。
これはさっきのキャッシュ。
で、このページを、キャッシュを無視して強制リロードすると
http://s1303.photobucket.com/user/arai_unmht/media/x_zps7cd4edca.jpg.html
このページに飛ばされる。
それからもうひとつ応答が変わる要因があって、そっちは Referer フィールド。
Referer が photobucket.com なら、Accept が text/html でも画像が返ってくる。
telnet i1303.photobucket.com 80 GET /albums/ag159/arai_unmht/x_zps7cd4edca.jpg HTTP/1.1 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:21.0) Gecko/20100101 Firefox/21.0 Host: i1303.photobucket.com Referer: http://photobucket.com/ Accept: text/html Connection: close
HTTP/1.1 200 OK Cache-Control: max-age=21600 Content-Length: 36143 Content-Type: image/jpeg ETag: "8d2f-4dc023456ed40" Expires: Mon, 06 May 2013 07:38:55 GMT Last-Modified: Mon, 06 May 2013 00:58:53 GMT Accept-Ranges: bytes Server: nginx Access-Control-Allow-Origin: * X-Cache-Status: HIT X-Forwarded-Server: phx1ws062 X-PB-Link: TRUE Date: Mon, 06 May 2013 01:38:55 GMT Connection: close
ところが、photobucket.com 以外だとリダイレクトされる。
telnet i1303.photobucket.com 80 GET /albums/ag159/arai_unmht/x_zps7cd4edca.jpg HTTP/1.1 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:21.0) Gecko/20100101 Firefox/21.0 Host: i1303.photobucket.com Referer: http://unmht.blogspot.com/ Accept: text/html Connection: close
HTTP/1.1 302 Moved Temporarily Content-Length: 210 Content-Type: text/html Location: http://s1303.photobucket.com/albums/ag159/arai_unmht/x_zps7cd4edca.jpg Server: Footprint Distributor V4.8 Date: Mon, 06 May 2013 01:39:57 GMT Connection: close
なので、
http://s1303.photobucket.com/user/arai_unmht/media/x_zps7cd4edca.jpg.html
を開いてから、[画像だけを表示] を選択した場合、Referer が photobucket.com なので強制リロードしても画像のままになる。
仕組みを知らずに試すと何とも不思議な挙動に見える。
0 件のコメント:
コメントを投稿