[1] [[HTTP]] とか, [[HTML]] の [[META要素]]で頻用されるけど、 [[HTTP/1.0]] や [[HTTP/1.1]] には載ってない欄。 [[HTTP応答]][[頭欄]]らしい。 * 構文 - [10] Refresh = "Refresh" [FWS] ":" [FWS] refresh-content [2] HTML 4.0 には例示 (>>8) がある (4.01 にはない) けど、一般に使われているパラメーター型 (>>12; 例: >>3) ではなくて読点区切型 (>>13; 例: >>5) になってる。 - [11] refresh-content = refresh-param-content / refresh-comma-content - [12] refresh-param-content = refresh-second [[FWS] ";" [FWS] "URL=" value]]] - [13] refresh-comma-content = refresh-second [FWS] "," [FWS] refresh-uri [9] >>12 のようにパラメーターの属性名は [[URL]] になっていて、実際中身が URL でない [[URI]] である例は見たことが無いけど、 URL でない URI に対応している実装は、あえて URL に限定することなく、どんな URI でも受け付けるのが良いと考えられる。 - [14] refresh-second = 1*DIGIT - [15] refresh-uri = absoluteURI / relativeURI [17] [VAR(ABNF)[refresh-second]] (>>14) 秒''後''に (一度だけ) 指定 URL または自 URI を読む (そしてそれに移動する)。 ([VAR(ABNF)[refresh-second]] 秒''毎''に URI を読むわけでは'''ない'''。) [18] [VAR(ABNF)[refresh-second]] が "0" の場合、実質的に (標準的な) [[HTTP]] の redirect と同じになる。 でも [[Netscape]] の説明文 (>>9) はこんなことも言ってるぞ。 > a "Refresh" header can be returned as part of any HTTP response, including a redirection. So a single HTTP response can say "go get this URL now, and then go get this other URL in 10 seconds". > [INS[("Refresh" 頭は redirect を含む任意の HTTP 応答の一部として返すことが出来ます。ですから単一の HTTP 応答で「この URL に今行き、それからこの別の URL に10秒後に行くように。」と言うことが出来ます。)]] > This means you can have a continuous random URL generator! Have a normal random URL generator (such as ''URouLette'' ) that returns as part of its redirection response a "Refresh" directive that causes the browser to go get another random URL from the random URL generator in 18 seconds. > [INS[(これは継続無作為 URL 生成器を作れることを意味します! 普通の無作為 URL (例えば ''[RUBY[URouLette] [ルーレット] ]'') は "Refresh" 指示を redirect 応答の一部として返し、ブラウザーは他の無作為な URL を18秒後に無作為 URL 生成器から得ることになります。)'']]'']] [19] [[WAI]] とか [[HTML4]] は[[アクセス性]]の観点から使用しないように薦めている。 (確かに、 >>18 の Netscape の言ってる例は面白いけど、遊び以外でやられたらたまらんわな。) - [16] value = http-token / quoted-string / non-token [20] [VAR(ABNF)[value]] (>>16) の部分は、他の頭欄の作法からすると [VAR(ABNF)[http-token]] 以外の文字は [[quoted-string]] にしないといけないはず。 [21] この頭欄は [[HTML]] の [[META要素]] で使われる (例: >>6) 事が多い。 HTTP で見かけることはあまりない。 (皆無ではない。) HTTP 頭欄なのに HTTP で使ってもらえないなんて不憫だね。 [22] META 要素の属性値で既に「"」で囲まれているので、その中で更に (「"」で) 囲もうとする意識は無い。みっともないし。 そもそもその必要性に気付かないのだろうかね? ってことで、 主に CGI 出力 (Web chat の [[CGI]] script とか。) で、 [VAR(ABNF)[http-token]] 以外が生で出てきたりする (>>24)。 - [23] ○ - [24] × ※ (>>24) 「=」が URL に含まれるので quoted-string にするべき。 それから「&」は「&」でないと HTML として異常。 [25] そもそも URI は(絶対だと)「:」を含むので http-token にはならないことも多いじゃないか。 - [26] non-token = absoluteURI / relativeURI ;; 救済措置 [27] Netscape 社の説明文によると絶対 URL のみで相対 URL は使ってはいけない。けど、現実には結構使われている。 [28] [[fragment]] は要らないでしょう。多分。 あってもそこに飛ぶのはあんまり好ましくないような... (それを言うなら Refresh: 欄自体あっても飛ぶのは宜しくないなあ。) [29] >>28 なんで? 利用者にとってはちょっとあれだけど、一定時間後に下のほうに飛ぶとかあってもよさそう。 [30] 属性名が「URL」だから、URN とかは駄目なのかなあ... [31] >>30 See >>9 - [32] non-token /= 1*octet ;; 人にやさしく・・にも程がある。 [33] CGI の出力で、例えば Web chat CGI script で名前とかが [[URI符号化]]されてなかったりすることもままある。 それだと URI としてすら正しくない。 そんなのまで救済 (>>32) してあげる必要があるのかどうか。 - [56] 値を [SAMP[URL=foo.html]] のように (秒なしで) 指定している文書があるようです。 [[MacIE]] 4.5 にはこの時 URL 指定を無視して''当該文書''を即座に読み込み直す不具合があるそうです。 (''Internet Explorer 4.5(Mac版)'' ) - [66] >>2 HTML 4.01 では不適切だとして削除されたそうです。変更履歴参照。 [[#comment]] ** UA の実装 [40] [[Opera]] (6.05 で実験) は、 [CODE["]] で囲まれていると、 [CODE["]] も [[URI]] の一部 (すなわち、 URI 符号化されていない不適切な相対 URI) とみなして、そこに飛ぼうとしますから、 (ふつう) 404 となります。 [41] (>>40) ですから [CODE["]] をはずせばよいのですが、この時 URI に [CODE[;]] が含まれていると、そこを [CODE[url] パラメーター (>>12)]] の終わりとみなしてしまいます。対処法はその URI の性質に応じて [CODE[&]] に置き換えるなり URI 符号化するなりするしかありません。 [42] [[NetscapeNavigator]] 2.01 は、 >>41 と同様に [CODE[;]] があると問題が起こります。 (>>40 の [CODE["]] は問題ありません。) [43] [[WinIE]] 3.02, [[WinIE]] 5.5, [[Mozilla]] などでは今のところ問題は確認されていません。 [44] [[HTML]] の meta 要素と HTTP の頭欄の一方だけにしか対応していない [[UA]] はまだ見つかっていません。 - [45] NN2.01 は、タイミング? により Refresh: 欄を指定しても飛んでくれないことがありました。 HTML に meta 要素でも同じ内容を指定すればちゃんと飛んでくれましたが、必ずこれで直るかはわかりません。 - [46] >>27 NN2.01 では相対 URI でも動きました。 - [47] >>28 に飛ばすのは NN2.01 を含めていろんなブラウザは対応していますね。 - [48] >>42 [[NC]]4 PR4 でも同様の問題が確認できました。 - [49] ''[[Amaya]] 7.0'': 未対応。Wish list には載ってましたが・・・ - [50] ''Mozilla/1.22 (compatible; MSIE 2.0; Windows 95)'': 対応。>>40 問題がありました。 >>41 問題はありません。 - [51] ''WinIE 6.0'': 対応。WinIE5 もそうですが、 [CODE[0]] にしても表示されてから飛び始めるまでにちょっと間があります。 (Moz ならすぐに飛び始めるのに。) IE はレンダリングその他全て完了した後に処理を始めるんでしょうか? (Moz もそうだと思うんだけどなあ。) (単に IE がのろいだけとか?) - [52] ''WinIE6'': 対応。「セキュリティ ゾーン」の設定で無効に出来ます。 - [55] ''MacIE 4.5'': 対応。変な不具合あり (>>56) - [67] ''NC 4.01'': 対応。[SAMP(HTTP)[url='foo']] ([CODE[']] quote) でも動いてしまいました。っていうかいままでうっかり間違って [CODE[']] で quote してました。 (ってことは最新の [[Mozilla]] でも動くのか?) - [68] ''WinIE 3.01'': 対応。>>67 のように書くと、単引用符で始まる相対 URI として扱います。 (正しい動作) - [70] ''emacs-w3m'': 対応。>>40 emacs-w3m にもその問題がありました [emacs-w3m:06562] が、修正されました [emacs-w3m:06656]。 修正のついでに [CODE[']] で引用してもよいことにされたらしいですが、気持ち悪いなあ。 ([CODE(ABNF)[[[value]]]] として解釈するなら、 [CODE[']] は [CODE(ABNF)[[[token]]]] の一部と解釈するのが正しい。) - [72] ''[[Lynx]]'': 対応。1996年8月2日の版で [[URI]] をレンダリングするようになったそうです。 [[#form:'%text(id=>ua,label=>"[[UA]]"); %check(label=>対応している,default,id=>support); %text(id=>condition,label=>詳細,size=>10); %submit(label=>"追加");':'-[%index;] \'\'%text(source=>ua);\'\': %iif(source=>support,true=>対応。,false=>未対応。);%text(source=>condition);':'%require(ua);']] ** [CODE(HTTP)@en[url]] 引数の引用符 [405] テスト ([[HTML]]): [CITE[Index of /~wakaba/-temp/test/html/meta/http-equiv/refresh]] ([TIME[2009-01-05 22:29:25 +09:00]] 版) の squote、dquote [406] ([[HTML]]) [[Firefox]] 3.0.5、[[Opera]] 9.61、[[Chrome]] 1.0.154.36、 [[WinIE7]] のいずれも、 [CODE(HTML example)@en[url="double-quoted"]] と [CODE(HTML example)@en[url='single-quoted']] の両方に対応していました。 [408] テスト ([[HTTP]]): [CITE[Index of /~wakaba/-temp/test/http/refresh]] ([TIME[2009-01-05 22:54:49 +09:00]] 版) [409] ([[HTTP]]) [[Firefox]] 3.0.5、[[Safari]] 3.2.1、 [[WinIE7]] のいずれも、 [CODE(HTTP example)@en[url="double-quoted"]] と [CODE(HTTP example)@en[url='single-quoted']] の両方に対応していました。 [[Opera]] 9.61 は [CODE(HTTP example)@en[url="double-quoted"]] に対応していましたが、 [CODE(HTTP example)@en[url='single-quoted']] には対応していません ([CODE(URI)@en['single-quoted']] という [[URL]] とみなします)。 * 飛び先のプロトコルに関して [34] [[Web]] [[chat]] の [[CGI]] script などで、飛び先が [[HTTP]] の ''304 Not Modified'' 応答を返すように仕向けることがあるみたいです。 これを受け取ったら refresh 元のの表示を続けるのはいいとして、また指定秒数待って飛ぶのが適切かどうかはわかりません。 [35] ''205 No Content'' も考慮する必要がありますね。 * 例 - [3] Refresh: 20; URL="http://suika.fam.cx/" - [4] Refresh: 30 - [5] Refresh: 0,refreshed.html [INS[(使用するべきではない。)]] - [6] * See also - [7] - [8] * メモ - [36] 飛び先が自分自身だと無限 loop になる危険性がありますが、 Web chat のように意図的にそうしている場合もありますからどうしようもないですね。 [CODE[Refresh: 0]] が数回続いたら中断、とかがいいんでしょうか。 - [37] [[WinIE]] は [CODE[Refresh: 0]] で飛んだら履歴 (「戻る」ボタンのメニュー) から飛び元の頁を消しますね。 (WinIE 5.0 くらいからだったっけ?) - [38] WinIE 3.0 が HTTP 頭の [CODE[Refresh:]] 欄に対応しているんを確認しました - [53] ''Another HTML-lint : Explanation'' - [54] [CODE[Refresh:]] に対応していない UA や設定で切られている場合を考慮して、本体 ([[HTML]] など) でも[[ハイパーリンク]] ([[a]] 要素など) を用意しておくのが望ましいでしょう。 - [57] >>1 [[応答頭欄]]よりも[[実体頭欄]]かと思ったけど、 Netscape は応答頭欄だとしていますね。どっちがいいかわからなくなってきた... - [58] >>57 実際の使い方を考えれば、「移転しますた」とかは、頁の内容の一部に近いメタ情報ということで、実体頭欄に分類できると思われ。一方 Netscape の目論見では server push もどきなんだから、プロトコル要素 (→応答頭欄) のような気もするな。 - [59] [[w3m]] や [[Lynx]] では、 [[a]] 要素のような[[ハイパーリンク]]として文書の最初に表示します。 w3m の場合は更に自動で飛ぶことも出来ます。 - [60] >>59 0 秒後とかならともかく、10秒後とかに、予告無く移動が始まると驚かされますから、他の UA であっても、画面に表示する内容に Refresh: の情報を加えて欲しいですよねえ。 - [61] [[ダウンロード]]の頁で、リンク先がダウンロードする資源そのものではなく、 HTML でその [CODE(HTTP)[Refresh]] が当該資源になっていることが、特に海外のサイトでしばしばあります。何を狙っているのか知りませんが、何か異様な気がしてすきになれません。 - [62] >>61 の「ダウンロード画面が出る」例だけではなくて、例えば大抵メイル作成画面が出るように設定されている [[mailto:]] [[URI]] などが指定されていると利用者は面食らうでしょう。 - [63] >>62 特に秒数が大きいと忘れたころ (本文読んでる途中とか。) に突然変化が起こったり。一般に秒数には制限があったほうがいいかも。 - [64] >>61 加えて、 URI を使って致命的な動作が可能な場合 (独自拡張とか。例: [[X-Becky-*:]>>2]) は非常に危険です。そのような機能は実行されないように制限する必要があるでしょう。 - [65] >>63 現在の多くの実装では [CODE(HTTP)[Refresh:]] 指定の存在を即座に示す UI が無いのももんだいでしょう。 [[w3m]] などだと [CODE(HTTP)[Refresh:]] を頁の上のほうにリンクとしてレンダリングします。 - [69] 無料サービス系 Web サイトとかで、 [CODE(HTTP)[[[404]]]] などのエラー時の出力に [CODE(HTTP)[Refresh]] で、エラー報告を数秒した後にそのサービスの[[トップ頁]]に飛ばすようなのがよくあります。これは bad practice だと思います。 URI を手入力して typo してしまって、直そうと思ったら次の URI に飛んでしまうとか。 (ブラウザの界面の実装の問題ではありますが。) [71] 鯖移転による URI 変更の告知などは、 [CODE(HTTP)[Refresh]] では''なく''、 [CODE(HTTP)[[[301]]]] + [CODE(HTTP)[[[Retry-After]]]] を使いましょう。 ([[名無しさん]]) [73] [CITE[netscape4.xでの動作]] > METAタグよりも前にjavascriptを記述すると、画面遷移してくれないようでした。 ([[名無しさん]] [sage]) [74] [CODE(HTTP)@en[[[Refresh]]]]とは関係ありませんが、最近の[[Webブラウザ]]、特に[[タブ・ブラウザ]]には特定時間毎の自動[[再読込]]機能がついているものが多いようです。 ([[名無しさん]] [sage] [WEAK[2006-02-06 14:07:50 +00:00]]) [75] [CITE[Bug 83265 – UAAG: Add a way to disable HTTP-EQUIV=refresh (block automatic meta redirection, lock on current page)]] ([CODE[2007-02-09 08:28:26 +09:00]] 版) ([[名無しさん]]) [76] [CITE[A blog? with Σαιτω - Kestrel - auto-refresh]] ([TIME[2007-07-21 20:19:47 +09:00]] 版) [407] 念のため [CODE(HTML)@en[[[name]]=[[refresh]]]] として確認してみましたが、 どの [[Webブラウザ]]もちゃんと無視しました。