* 添付ファイルには HTTP Last-modified ヘッダをつけるべき [#q85c574d] - ページ: [[BugTrack2]] - 投稿者: [[一ユーザー]] - 優先順位: 低 - 状態: 提案 - カテゴリー: 本体バグ - 投稿日: 2007-06-18 (月) 18:19:37 - バージョン: ** メッセージ [#sb85464f] 現状添付ファイルにアクセスしてもLast-modifiedが付加されず、添付ファイルをローカルに保存しようとした場合、タイムスタンプにはダウンロードした時の時刻しか保存されません。もちろんローカルからアップロードした際に「オリジナルのタイムスタンプ」は現状失われている訳ですが、少なくともアップロードされた時刻を返すべきです。 負荷軽減などの観点から[[BugTrack/799]]などで議論されていますが、特にここで述べたいのはファイルのメタ情報としてのタイムスタンプという視点です。ファイルシステムにもよりますが、作成日時と更新日時によって前者をダウンロードした日時、後者をファイルがアップロードされた日時としてファイルを管理できます。 余談になりますが、現状多くのWebブラウザはタイムスタンプをうまく取り扱わず、Mozilla でさえも[[Bug 178506:https://bugzilla.mozilla.org/show_bug.cgi?id=178506]]として放置され続けています…。 -------- - コメントありがとうございます。ご希望の状態にするためには恐らく少なくとも二段階必要だろうと思います。(1)まずはLast-modifiedをつけて出力できるようにする。その過程で、時刻表現に関するあれこれを克服する。(2)時刻を受け取って、それを保存する方法を模索する。時刻を修飾するだけなら恐らくtouch()でいけるのですが、それだけでいいのかどうか、まずい事にならないかどうか、あれこれ模索する。 -- [[henoheno]] &new{2007-06-24 (日) 23:17:33}; - 現状 PukiWiki は RFC2822 形式の時刻表現を使用していないのでしょうか。何故添付ファイルに限った提案にしたかというと、Wikiで生成されたページなどと違い、一般的にアップロードされたファイルは静的であるからで、Last-modified (あるいは E-tag も)がアップロードされた時刻から変化することは、直接ファイルを置き換えない限りないと思われるからです。(が、見落としていることがあるでしょうか。) 添付ファイルごとにメタ情報を格納しておいてアクセスがあればそこから読み出すという形ではどうでしょう。[[BugTrack2/170]]などでの指摘のあるMD5などもそこに入れてしまうのはいかがでしょうか。 -- [[一ユーザー]] &new{2007-06-27 (水) 22:52:32}; - 現状は、[[RFC2616>http://www.studyinghttp.net/cgi-bin/rfc.cgi?2616]] の3.3.1 節にも書かれている[[RFC822>RFC:822]](Obsoleted by RFC2822)の5. 節をベースにしていて、&br;その当時は「Sun, 06 Nov 1994 08:49:37 GMT」と「Sun, 06 Nov 1994 08:49:37 +0000」のどちらでもOKだったようですが、&br;[[RFC2822>RFC:2822]](Obsoletes RFC822)では A.6.2. Obsolete dates The following message uses an obsolete date format, including a non- numeric time zone and a two digit year. Note that although the day-of-week is missing, that is not specific to the obsolete syntax; it is optional in the current syntax as well. とあって「Sun, 06 Nov 1994 08:49:37 +0000」の形のみOKに変わったようです。(書式の詳細な定義は3.3. 節を参照)&br;header_lastmod() も改修対象になるんですかね。 -- &new{2009-04-24 (金) 23:14:53}; - Last-modified を出力させる改造例 -- &new{2009-08-15 (土) 17:39:34}; --[[cvs:plugin/attach.inc.php]] (r1.91) 720行目あたり $filename = htmlspecialchars($filename); + $filetime = date('D, d M Y H:i:s', $this->time) . ' +0000'; ini_set('default_charset', ''); mb_http_output('pass'); pkwk_common_headers(); header('Content-Disposition: inline; filename="' . $filename . '"'); header('Content-Length: ' . $this->size); header('Content-Type: ' . $this->type); + header('Last-Modified: ' . $filetime); @readfile($this->filename); exit; } } // ファイルコンテナ class AttachFiles --[[cvs:plugin/ref.inc.php]] (r1.50) 420行目あたり } $file = htmlspecialchars($filename); $size = filesize($ref); + $filetime = date('D, d M Y H:i:s', filemtime($ref) - LOCALZONE) . ' +0000'; // Output pkwk_common_headers(); header('Content-Disposition: inline; filename="' . $filename . '"'); header('Content-Length: ' . $size); header('Content-Type: ' . $type); + header('Last-Modified: ' . $filetime); @readfile($ref); exit; } ?> --蛇足で、[[BugTrack/799]] の「その他のコメント」で話があったrss ファイルも。[[cvs:plugin/rss.inc.php]] (r1.21) 80行目あたり break; } } + + $filetime = date('D, d M Y H:i:s', filemtime($recent) - LOCALZONE) . ' +0000'; // Feeding start pkwk_common_headers(); header('Content-type: application/xml'); + header('Last-Modified: ' . $filetime); print '<?xml version="1.0" encoding="UTF-8"?>' . "\n\n"; $r_whatsnew = rawurlencode($whatsnew); switch ($version) { -- 追記: さらに蛇足。[[BugTrack/799]] の「ブラウザの挙動(back)について / If-Modified-Since」の内容を、簡易で組み込んでみる(簡易なので、REQUEST_METHOD に応じた分岐がないといった問題が残ってますが・・・) -- &new{2009-10-03 (土) 16:12:08}; ---ref プラグインの改造例。[[cvs:plugin/ref.inc.php]] (r1.50) 420行目あたり } $file = htmlspecialchars($filename); $size = filesize($ref); + $time = filemtime($ref) - LOCALZONE; + $filetime = date('D, d M Y H:i:s', $time) . ' +0000'; + $etag = sprintf('%x-%x', $size, $time); // Output pkwk_common_headers(); header('Content-Disposition: inline; filename="' . $filename . '"'); header('Content-Length: ' . $size); header('Content-Type: ' . $type); + header('Last-Modified: ' . $filetime); + header('Etag: ' . $etag); + + if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && isset($_SERVER['HTTP_IF_NONE_MATCH']) && + $_SERVER['HTTP_IF_MODIFIED_SINCE'] === rtrim($filetime, "\r\n") && + $_SERVER['HTTP_IF_NONE_MATCH'] === rtrim($etag, "\r\n")) { + header('HTTP/1.0 304 Not Modified'); + exit; + } + @readfile($ref); exit; } ?> ---rss プラグインの改造例。[[cvs:plugin/rss.inc.php]] (r1.21) 80行目あたり break; } } + + $size = strlen($items); + $time = filemtime($recent) - LOCALZONE; + $filetime = date('D, d M Y H:i:s', $time) . ' +0000'; + $etag = sprintf('%x-%x', $size, $time); // Feeding start pkwk_common_headers(); header('Content-type: application/xml'); + header('Last-Modified: ' . $filetime); + header('Etag: ' . $etag); + + if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && isset($_SERVER['HTTP_IF_NONE_MATCH']) && + $_SERVER['HTTP_IF_MODIFIED_SINCE'] === rtrim($filetime, "\r\n") && + $_SERVER['HTTP_IF_NONE_MATCH'] === rtrim($etag, "\r\n")) { + header('HTTP/1.0 304 Not Modified'); + exit; + } + print '<?xml version="1.0" encoding="UTF-8"?>' . "\n\n"; $r_whatsnew = rawurlencode($whatsnew); switch ($version) { #comment