これから宣言的に更新する

Refresh: ヘッダー (HTTP)

[1] Refresh: は、指定した数が経過した後に navigate を開始するべきことを示す HTTPヘッダーです。 <meta http-equiv=Refresh> は、 同じく HTML プラグマ指令です。

仕様書

構文

[2] HTML 4.0 には例示 (>>8) がある (4.01 にはない) けど、一般に使われているパラメーター型 (>>12; 例: >>3) ではなくて読点区切型 (>>13; 例: >>5) になってる。

[9] >>12 のようにパラメーターの属性名は URL になっていて、実際中身が URL でない URI である例は見たことが無いけど、 URL でない URI に対応している実装は、あえて URL に限定することなく、どんな URI でも受け付けるのが良いと考えられる。

[17] refresh-second (>>14) 秒に (一度だけ) 指定 URL または自 URI を読む (そしてそれに移動する)。 (refresh-secondに URI を読むわけではない。)

[18] 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".

("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 http://kuhttp.cc.ukans.edu/cwis/organizations/kucia/uroulette/uroulette.html) 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.

(これは継続無作為 URL 生成器を作れることを意味します! 普通の無作為 URL (例えば URouLette (ルーレット] ]) は "Refresh" 指示を redirect 応答の一部として返し、ブラウザーは他の無作為な URL を18秒後に無作為 URL 生成器から得ることになります。))

[19] WAI とか HTML4アクセス性の観点から使用しないように薦めている。 (確かに、 >>18 の Netscape の言ってる例は面白いけど、遊び以外でやられたらたまらんわな。)

[20] value (>>16) の部分は、他の頭欄の作法からすると http-token 以外の文字は quoted-string にしないといけないはず。

[21] この頭欄は HTMLMETA要素 で使われる (例: >>6) 事が多い。 HTTP で見かけることはあまりない。 (皆無ではない。) HTTP 頭欄なのに HTTP で使ってもらえないなんて不憫だね。

[22] META 要素の属性値で既に「"」で囲まれているので、その中で更に (「"」で) 囲もうとする意識は無い。みっともないし。 そもそもその必要性に気付かないのだろうかね? ってことで、 主に CGI 出力 (Web chat の CGI script とか。) で、 http-token 以外が生で出てきたりする (>>24)。

※ (>>24) 「=」が URL に含まれるので quoted-string にするべき。 それから「&」は「&amp;」でないと HTML として異常。

[25] そもそも URI は(絶対だと)「:」を含むので http-token にはならないことも多いじゃないか。

[27] Netscape 社の説明文によると絶対 URL のみで相対 URL は使ってはいけない。けど、現実には結構使われている。

[28] fragment は要らないでしょう。多分。 あってもそこに飛ぶのはあんまり好ましくないような... (それを言うなら Refresh: 欄自体あっても飛ぶのは宜しくないなあ。)

[29] >>28 なんで? 利用者にとってはちょっとあれだけど、一定時間後に下のほうに飛ぶとかあってもよさそう。

[30] 属性名が「URL」だから、URN とかは駄目なのかなあ...

[31] >>30 See >>9

[33] CGI の出力で、例えば Web chat CGI script で名前とかが URI符号化されてなかったりすることもままある。 それだと URI としてすら正しくない。 そんなのまで救済 (>>32) してあげる必要があるのかどうか。

UA の実装

[40] Opera (6.05 で実験) は、 " で囲まれていると、 "URI の一部 (すなわち、 URI 符号化されていない不適切な相対 URI) とみなして、そこに飛ぼうとしますから、 (ふつう) 404 となります。

[41] (>>40) ですから " をはずせばよいのですが、この時 URI に ; が含まれていると、そこを url] パラメーター (>>12) の終わりとみなしてしまいます。対処法はその URI の性質に応じて & に置き換えるなり URI 符号化するなりするしかありません。

[42] NetscapeNavigator 2.01 は、 >>41 と同様に ; があると問題が起こります。 (>>40" は問題ありません。)

[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 <somewhere#fragment> に飛ばすのは NN2.01 を含めていろんなブラウザは対応していますね。
  • [48] >>42 NC4 PR4 でも同様の問題が確認できました。
  • [49] Amaya 7.0: 未対応。Wish list には載ってましたが・・・
  • [50] Mozilla/1.22 (compatible; MSIE 2.0; Windows 95): 対応。>>40 問題がありました。 >>41 問題はありません。
  • [51] WinIE 6.0: 対応。WinIE5 もそうですが、 0 にしても表示されてから飛び始めるまでにちょっと間があります。 (Moz ならすぐに飛び始めるのに。) IE はレンダリングその他全て完了した後に処理を始めるんでしょうか? (Moz もそうだと思うんだけどなあ。) (単に IE がのろいだけとか?)
  • [52] WinIE6: 対応。「セキュリティ ゾーン」の設定で無効に出来ます。
  • [55] MacIE 4.5: 対応。変な不具合あり (>>56)
  • [67] NC 4.01: 対応。url='foo' (' quote) でも動いてしまいました。っていうかいままでうっかり間違って ' で quote してました。 (ってことは最新の Mozilla でも動くのか?)
  • [68] WinIE 3.01: 対応。>>67 のように書くと、単引用符で始まる相対 URI として扱います。 (正しい動作)
  • [70] emacs-w3m: 対応。>>40 emacs-w3m にもその問題がありました [emacs-w3m:06562] が、修正されました [emacs-w3m:06656]。 修正のついでに ' で引用してもよいことにされたらしいですが、気持ち悪いなあ。 (value として解釈するなら、 'token の一部と解釈するのが正しい。)
  • [72] Lynx: 対応。1996年8月2日の版で URI をレンダリングするようになったそうです。

url 引数の引用符

[405] テスト (HTML): Index of /~wakaba/-temp/test/html/meta/http-equiv/refresh ( 版) http://suika.fam.cx/~wakaba/-temp/test/html/meta/http-equiv/refresh/ の squote、dquote

[406] (HTML) Firefox 3.0.5、Opera 9.61、Chrome 1.0.154.36、 WinIE7 のいずれも、 url="double-quoted"url='single-quoted' の両方に対応していました。

[408] テスト (HTTP): Index of /~wakaba/-temp/test/http/refresh ( 版) http://suika.fam.cx/~wakaba/-temp/test/http/refresh/

[409] (HTTP) Firefox 3.0.5、Safari 3.2.1、 WinIE7 のいずれも、 url="double-quoted"url='single-quoted' の両方に対応していました。 Opera 9.61 は url="double-quoted" に対応していましたが、 url='single-quoted' には対応していません ('single-quoted' という URL とみなします)。

[410] Bug 6464 – Support meta refresh with quotes ( 版) http://www.w3.org/Bugs/Public/show_bug.cgi?id=6464

文脈

[97] しばしば、サーバー側での HTTPリダイレクトを設定するのが困難な場合の代替として使われます。

[98] 何らかの Webページの表示とダウンロードを同時に実行したいときに使われることもあります。

飛び先のプロトコルに関して

[34] Web chatCGI script などで、飛び先が HTTP304 Not Modified 応答を返すように仕向けることがあるみたいです。

これを受け取ったら refresh 元のの表示を続けるのはいいとして、また指定秒数待って飛ぶのが適切かどうかはわかりません。

[35] 205 No Content も考慮する必要がありますね。

処理

[86] 構文解析器または DOM 操作により Refreshmeta 要素文書に挿入された場合、 content 属性値構文解析を行います。

[108] 要素文書に挿入された時、次のようにしなければなりません >>85

  1. [153] 入力を、要素content 属性値に設定します。
  2. [154] 入力null または空文字列の場合、
    1. [155] ここで停止します。
  3. [152] 共有宣言的更新手順群を実行します。
    文書
    要素節点文書
    入力
    入力
    メタ要素

[151] 共有宣言的更新手順群 (shared declarative refresh steps) は、 文書入力メタ要素について、次のようにします >>85

  1. [116] 文書これから宣言的に更新するフラグがの場合、
    1. [110] ここで停止します。
  2. [124] 時間URL を、 文書入力を処理 (>>125) した結果に設定します。
  3. [123] URL失敗なら、
    1. [126] ここで停止します。
  4. [111] 文書これから宣言的に更新するフラグを、に設定します。
  5. [127] 次のいずれか1つ以上を実行します。
[156] この処理は、 meta 要素文書に挿入された場合の他に、 navigate において Refresh: ヘッダーが指定されていた場合にも、実行されます。

[112] 文書は、 これから宣言的に更新する (will declaratively refresh) フラグを持ちます。 初期値はです。 HTML Standard

[125] 文書入力の処理は、次のようにしなければなりません >>85

  1. [117] 入力の先頭から、間隔文字を除去します。
  2. [118] 数字列を、入力の先頭の ASCII数字列とし、それを入力から除去します。
  3. [120] 数字列空文字列なら、
    1. [121] ここで停止します。
  4. [119] 時間を、数字列非負整数を構文解析する規則を適用した結果に設定します。
  5. [122] 入力の先頭から、 .ASCII数字をすべて除去します。


[92] 利用者エージェントは、指定時間経過後に navigate することができます。

[130] これが最も一般的で、著者が想定する実装方法です。

[136] 次のようにしなければなりません

  1. [131] 利用者による停止フラグを、に設定します。
  2. [137] 更新の期限が到来 (refresh has come due) を、時間 (利用者および利用者エージェントの都合により調整可能。) 待つタイマーに設定します。 >>85
  3. [138] 文書completely loadedなら、
    1. [139] 更新の期限が到来の計測を開始します。
  4. [140] それ以外なら、
    1. [141] 文書completely loaded から起算するタイマーに、 更新の期限が到来を追加します。

[113] つまり、meta挿入completely loadedの遅い方から起算して時間待ちます。 Refresh: ヘッダーの場合には、completely loadedから起算します。

[88] 待つ時間は利用者利用者エージェントによる調整が認められています。 仕様書にはその意図は明記されていませんが、利用者が視認できない速さで navigate が実行されることを利用者が望まない時にこれを緩和したり、 高頻度で navigate を繰り返す悪意ある Webページ利用者が惑わされることを防いだり、 裏側で動作するWebページnavigate を遅延させて電力消費を抑えたりできるようにすることを企図していると思われます。

[87] 更新の期限が到来したら、 次のようにしなければなりません >>85

  1. [132]
    ... をすべて満たす場合、
    1. [133] navigate します。
      navigate する閲覧文脈
      文書閲覧文脈
      新しい資源
      URL記録
      置換有効
      始点閲覧文脈
      文書閲覧文脈

[104] 利用者エージェントは、利用者利用者による停止フラグをに設定する手段を提供することが認められています >>85。一般的な Webブラウザーでは、中止ボタンがこの機能を持っています。

[95] 利用者エージェントは、タイマーの状態やリダイレクト先などを随時表示して構いません >>85。 一般的な Webブラウザーではそのような表示は見られませんが、便利そうではあります。


[93] 利用者エージェントは、手動で navigate することを選択できる利用者インターフェイスを提供することができます。

[91] その場合、利用者の指示により、次のようにしなければなりません >>85

  1. [128] navigate します。
    navigate する閲覧文脈
    文書閲覧文脈
    新しい資源
    URL記録
    始点閲覧文脈
    文書閲覧文脈

[129] 現在の Webブラウザーではそのような利用者インターフェイスの提示は一般的ではありませんが、 かつてはテキストブラウザーなどで Refresh を通常のハイパーリンクのような形で表示するものがありました。


[94] 利用者エージェントは、何もしないことも認められています。

[96] 全く何もしないのは、 Web互換では無いかもしれません。 しかし mailto:telnet: への navigate などは無効にできた方が嬉しいかもしれません。

利用者インターフェイス

[105] アドレスバーも参照。

歴史

[416] リンク型 redirect は、 XHTML2 の第4次案で検討対象として挙げられていました。

http-equiv の機能で XHTML2 に欠けているもの」 とされているので、 <meta http-equiv=refresh> の代替として検討されていたものと推測されます。

See also

メモ

[71] 鯖移転による URI 変更の告知などは、 Refresh ではなく301 + Retry-After を使いましょう。 (名無しさん)

[73] netscape4.xでの動作 http://www.parkcity.ne.jp/~chaichan/qanda/qa6139.htm

METAタグよりも前にjavascriptを記述すると、画面遷移してくれないようでした。

(名無しさん [sage])

[74] Refreshとは関係ありませんが、最近のWebブラウザ、特にタブ・ブラウザには特定時間毎の自動再読込機能がついているものが多いようです。 (名無しさん [sage] 2006-02-06 14:07:50 +00:00)

[75] Bug 83265 &#8211; UAAG: Add a way to disable HTTP-EQUIV=refresh (block automatic meta redirection, lock on current page) (2007-02-09 08:28:26 +09:00 版) https://bugzilla.mozilla.org/show_bug.cgi?id=83265 (名無しさん)

[76] A blog? with Σαιτω - Kestrel - auto-refresh ( 版) http://d.hatena.ne.jp/saiton/20070718/1184716567

[407] 念のため name=refresh として確認してみましたが、 どの Webブラウザもちゃんと無視しました。

[411] 携帯アフィリエイトバイブル -携帯で稼ぐ- 携帯・PC振分け(PC拒否)方法<初心者版> ( 版) http://upup.blog3.fc2.com/blog-entry-184.html

[412] Techniques for WCAG 2.0 ( ( 版)) http://www.w3.org/TR/2012/NOTE-WCAG20-TECHS-20120103/complete.html#F58-description

[413] IRC logs: freenode / #whatwg / 20120724 ( ( 版)) http://krijnhoetmer.nl/irc-logs/whatwg/20120724#l-885

[414] Web Applications 1.0 r7697 Match reality ( ( 版)) http://html5.org/tools/web-apps-tracker?from=7696&to=7697

[415] 3248 – HTTP headers are not passed on to main NGLayout code [IMPORT] ( ( 版)) https://bugzilla.mozilla.org/show_bug.cgi?id=3248

[418] The Performance Impact of META REFRESH - IEInternals - Site Home - MSDN Blogs ( ( 版)) http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/meta-refresh-causes-additional-http-requests.aspx

[39] An Exploration of Dynamic Documents ( 版) http://web.archive.org/web/19970614044340/http://home.netscape.com/assist/net_sites/pushpull.html

Refresh

[77] Refresh HTTP Header - otsukare ( 版) http://www.otsukare.info/2015/03/26/refresh-http-header

[78] Add "metarefresh" context. Fixes https://www.w3.org/Bugs/Public/show_bug... · whatwg/fetch@be254da ( 版) https://github.com/whatwg/fetch/commit/be254dafad562943edca3541517fd8018f14f75d

[79] Bug 28361 – Ambiguity in the context value for content loaded through <meta http-equiv=refresh> in a frame/iframe ( 版) https://www.w3.org/Bugs/Public/show_bug.cgi?id=28361

[80] draft-ietf-http-v11-spec-00 - Hypertext Transfer Protocol -- HTTP/1.1 ( 版) https://tools.ietf.org/html/draft-ietf-http-v11-spec-00#section-10.35

10.35 Refresh

TBS

[81] Re: HTTP/1.1 Refresh header field comments (Roy T. Fielding 著, 版) https://lists.w3.org/Archives/Public/ietf-http-wg-old/1996MayAug/0594.html

Refresh is no longer in the HTTP/1.1 document -- it has been deferred to

HTTP/1.2 (or later).

[82] An Exploration of Dynamic Documents ( 版) http://web.archive.org/web/20020802170847/http://wp.netscape.com/assist/net_sites/pushpull.html

[83] Part2 - browsersec - Browser Security Handbook, part 2 - Browser Security Handbook - Google Project Hosting ( 版) https://code.google.com/p/browsersec/wiki/Part2#Redirection_restrictions

[84] A client request is also indicated by "metarefresh". https://www.w3.org/... · whatwg/fetch@1c7171d ( 版) https://github.com/whatwg/fetch/commit/1c7171ddf4f41568b4c94ad307ce8609a603d91a

[99] 28361 – Ambiguity in the context value for content loaded through <meta http-equiv=refresh> in a frame/iframe ( 版) https://www.w3.org/Bugs/Public/show_bug.cgi?id=28361#c3

[100] Make the ';' optional in parsing meta refresh · whatwg/html@0a3dcdf ( 版) https://github.com/whatwg/html/commit/0a3dcdfa15d73334ba6c2a0a12c2f139d526da5a

[101] Better match Gecko in parsing of meta refresh · whatwg/html@94750dc ( 版) https://github.com/whatwg/html/commit/94750dc5f3ffca7c6b54a79b86526a39b2cbff14

[102] URLs are parsed and produce records · whatwg/html@30bc255 ( 版) https://github.com/whatwg/html/commit/30bc2557105ad62881ec9670f253febbc9761b44

[103] Fix #823: Don't strip characters from the URL in meta refresh · whatwg/html@543d8c1 ( 版) https://github.com/whatwg/html/commit/543d8c1598bf5bff0b8febc50dff11dcb42f8768

[106] 28520 – Should the sandboxing flags be captured when setting up the refresh? () https://www.w3.org/Bugs/Public/show_bug.cgi?id=28520

[107] Snapshot the node document used for <meta> refresh (domenic著, ) https://github.com/whatwg/html/commit/c4c68db6b09172f69ad51ffd96e868a4c1c87907

[90]RefreshW3C非推奨だといっている」という説がありますが、 どうやら W3C作業部会が 2000年に Note として公開した後十数年間放置されていてメンテナンスされていない文書 >>89 が根拠とされているようです。

[89] HTML Techniques for Web Content Accessibility Guidelines 1.0 ( 版) https://www.w3.org/TR/2000/NOTE-WCAG10-HTML-TECHS-20001106/#meta-element

[142] 誰かが駄目だと言っているから駄目だ、というのではなく、書かれている理由に納得できるかどうかで考えた方が建設的じゃないですかねぇ。 現在の HTML 仕様である HTML Standard には使うなとは一言も書かれていないので、 後はその場その場で適切かどうかの判断と、宗教の問題でしょう。

[143] Masato Kinugawa Security Blog: Googleのmetaリダイレクトに存在した問題 () http://masatokinugawa.l0.cm/2012/03/googlemeta.html

[144] IE6/7の&lt;meta refresh&gtでは「;」で区切ってURLが複数指定できる問題 - 葉っぱ日記 () https://d.hatena.ne.jp/hasegawayosuke/20120301/p1

[145] Allow decimals with no leading 0 as the time in refresh <meta> (domenic著, ) https://github.com/whatwg/html/commit/b8a34e302cdf0289f5403a02905629bb358519a6

[146] Meta refresh: time without leading zero; e.g. content=".9; url=foo" · Issue #2844 · whatwg/html () https://github.com/whatwg/html/issues/2844

[147] Allow ".9" as the time in refresh <meta> by domenic · Pull Request #2852 · whatwg/html () https://github.com/whatwg/html/pull/2852

[148] Ensure Refresh pragma always uses a URL record (annevk著, ) https://github.com/whatwg/html/commit/64ea79523e6565070c9f5af7397a8104d7841cf9

[149] Ensure Refresh pragma always uses a URL record by annevk · Pull Request #2865 · whatwg/html () https://github.com/whatwg/html/pull/2865

[150] Define the HTTP Refresh header (annevk著, ) https://github.com/whatwg/html/commit/7e9f6b6ffe2119f43f909f71773a25a7e8a61ca7

[157] 28339 – <meta refresh> Specify Refresh HTTP header () https://www.w3.org/Bugs/Public/show_bug.cgi?id=28339

[158] Documenting Refresh: HTTP header · Issue #138 · httpwg/http-extensions () https://github.com/httpwg/http-extensions/issues/138

[159] Refresh HTTP Header - otsukare () http://www.otsukare.info/2015/03/26/refresh-http-header

[160] 28563 – As in most cases the http-equiv meta tags are equivalent to their corresponding HTTP header, would i [...] () https://www.w3.org/Bugs/Public/show_bug.cgi?id=28563

[161] Define the HTTP Refresh header by annevk · Pull Request #2892 · whatwg/html () https://github.com/whatwg/html/pull/2892

[114] Editorial: use "isomorphic decode" for Refresh header steps (irrationalRock著, ) https://github.com/whatwg/html/commit/bef6f783084cdb6e591f2a9d8c731180413e8ef2

[115] Changed Comment to Mention "isomorphic decode" by irrationalRock · Pull Request #3941 · whatwg/html () https://github.com/whatwg/html/pull/3941

[162] CEA-2014-B