ただのにっき
2008-03-14(金) [長年日記]
■ 「Amazon 退会」でググると一位な件
ちなみに、退会しても購入履歴は残るそうなので、無駄なあがきらしいですよ。
■ 存在しない静的ページへアクセスがあったらその場で生成したいんだが
煮え切らない試行錯誤のメモ。
たとえば、現時点では存在しないページ:
http://example.com/hoge.html
にアクセスがあったとする。でもhoge.htmlは存在しないので、404になる。そこでErrorDocumentディレクティブを使って、CGIのページに飛ばす:
ErrorDocument 404 /cgi-bin/generate.cgi
generate.cgiの中ではファイルhoge.htmlを生成して……さてここからが問題。
素直にLocationヘッダで生成後のhoge.htmlに飛ばしてもうまくいかない:
puts "Location: hoge.html\n\n"
IE7は空っぽの表示になった。ループを検知したのか、キャッシュが悪さをしているのか。そもそも404のままじゃまずいだろ。
じゃあ、generate.cgiのレスポンスをHTMLにして、meta refreshで飛ばしてはどうか:
puts <<-RES Content-Type: text/html <html><head> <meta http-equiv="refresh" content="1;url=hoge.html"> </head></html> RES
これはうまくいく。でも検索エンジンボットはたどってくれないから、不都合が多い。同様な理由でJavaScriptも採用したくない。
あ、Locationヘッダだけ指定するとステータスが404のままだからダメなのか? 303にしたら、なんかうまくいったんだけど、偶然だろうか*1:
puts <<-RES Status: 303 Moved Permanently Location: hoge.html RES
最終的にブラウザに返るステータスも200なので、これでいいなら楽だなぁ。RFCだけだとよくわからん。ぜったい誰かがやってるはずなので、ベストプラクティスがあるに違いないのだが。
続く。
*1 wgetはなぜか303でエラーだと言ってるが。IE7、Firefox、w3mはちゃんと移動してくれる。