はじめに
とある理由で受けとった壊れたQiitaのURLを開いたところ、完全に意図しないページに飛ばされた。これを元に色々と調べた結果、どうやらQiitaの記事は$1$から始まるオートインクリメントな番号でも参照できそうであるということが分った。
記事のリダイレクト機能
QiitaはユーザーIDの変更などで記事URLが変更されても、引き続き古いURLが使えるようになっている。これは次のように確かめることができる。まず、完全にアクセスできるURLhttp://qiita.com/yyu/items/aab20a0d1de7cf786409
のユーザーIDであるyyu
を適当に置き換えて、例えばhttp://qiita.com/this_is_a_pen/items/aab20a0d1de7cf786409
などとしてアクセスしても、次のようにリダイレクトされる。
$ curl --include http://qiita.com/this_is_a_pen/items/aab20a0d1de7cf786409
HTTP/1.1 302 Found
Cache-Control: no-cache
Content-Type: text/html; charset=utf-8
Date: Sat, 03 Sep 2016 07:23:42 GMT
Location: http://qiita.com/yyu/items/aab20a0d1de7cf786409
Server: nginx
Vary: Origin
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
X-Request-Id: bf516f1e-348c-4fdf-9317-6addf17df427
X-Runtime: 0.021502
X-XSS-Protection: 1; mode=block
transfer-encoding: chunked
Connection: keep-alive
<html><body>You are being <a href="http://qiita.com/yyu/items/aab20a0d1de7cf786409">redirected</a>.</body></html>
壊れたURLとオートインクリメントな記事番号
URLhttp://qiita.com/yyu/items/1638
を受け取って開いたところ、ユーザーIDがyyu
であるのに全く関係のないユーザーの記事が表示された。このことから、これはもしかして$1638$番目の記事が表示されたのではないかと考えて、次のようなURLをためした。
$ curl --include http://qiita.com/yyu/items/1
HTTP/1.1 301 Moved Permanently
Cache-Control: no-cache
Content-Type: text/html; charset=utf-8
Date: Sat, 03 Sep 2016 07:28:08 GMT
Location: http://qiita.com/yaotti/items/68f6ee99a35a15ed8074
Server: nginx
Vary: Origin
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
X-Request-Id: 438466b9-ccd7-486c-ac0e-f55034ffac0a
X-Runtime: 0.012392
X-XSS-Protection: 1; mode=block
Content-Length: 116
Connection: keep-alive
<html><body>You are being <a href="http://qiita.com/yaotti/items/68f6ee99a35a15ed8074">redirected</a>.</body></html>
さっそく、リダイレクト先の記事http://qiita.com/yaotti/items/68f6ee99a35a15ed8074
を開くと、この記事は2011年09月16日に投稿されていたことが分った。そして、次のURLに次のように書かれている。
「Qiita」は、2011年9月16日のサービス開始以来、堅調に利用者数を伸ばし、2012年10月31日時点で、月間ユニークユーザー数8万人を達成しました。
このように、あとは$1$から順番に数を大きくしていったところ、古い順に記事を取得することができたので、おそらく間違いはないだろうという結論に至った。
まとめ
今回の調査は手作業によるもので、プログラムを使って完全にそうであることを確かめるのはまだやっていないから、もしかしたらこの規則は成り立たないかもしれない。ただこういう仕様があるとしたら、何かの役に立つかもしれない。