2013年5月6日

Accept/Referer フィールドの値と Photobucket の応答

Photobucket が状況によって違うファイルを返すっぽいという事に起因するトラブルがあったので調べてみた。

まずは画像を適当に用意する。

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 件のコメント:

コメントを投稿