添付ファイルには HTTP Last-modified ヘッダをつけるべき

  • ページ: BugTrack2
  • 投稿者: 一ユーザー?
  • 優先順位: 低
  • 状態: 提案
  • カテゴリー: 本体バグ
  • 投稿日: 2007-06-18 (月) 18:19:37
  • バージョン:

メッセージ

現状添付ファイルにアクセスしてもLast-modifiedが付加されず、添付ファイルをローカルに保存しようとした場合、タイムスタンプにはダウンロードした時の時刻しか保存されません。もちろんローカルからアップロードした際に「オリジナルのタイムスタンプ」は現状失われている訳ですが、少なくともアップロードされた時刻を返すべきです。

負荷軽減などの観点からBugTrack/799などで議論されていますが、特にここで述べたいのはファイルのメタ情報としてのタイムスタンプという視点です。ファイルシステムにもよりますが、作成日時と更新日時によって前者をダウンロードした日時、後者をファイルがアップロードされた日時としてファイルを管理できます。

余談になりますが、現状多くのWebブラウザはタイムスタンプをうまく取り扱わず、Mozilla でさえもBug 178506として放置され続けています…。


  • コメントありがとうございます。ご希望の状態にするためには恐らく少なくとも二段階必要だろうと思います。(1)まずはLast-modifiedをつけて出力できるようにする。その過程で、時刻表現に関するあれこれを克服する。(2)時刻を受け取って、それを保存する方法を模索する。時刻を修飾するだけなら恐らくtouch()でいけるのですが、それだけでいいのかどうか、まずい事にならないかどうか、あれこれ模索する。 -- henoheno 2007-06-24 (日) 23:17:33
  • 現状 PukiWiki は RFC2822 形式の時刻表現を使用していないのでしょうか。何故添付ファイルに限った提案にしたかというと、Wikiで生成されたページなどと違い、一般的にアップロードされたファイルは静的であるからで、Last-modified (あるいは E-tag も)がアップロードされた時刻から変化することは、直接ファイルを置き換えない限りないと思われるからです。(が、見落としていることがあるでしょうか。) 添付ファイルごとにメタ情報を格納しておいてアクセスがあればそこから読み出すという形ではどうでしょう。BugTrack2/170などでの指摘のあるMD5などもそこに入れてしまうのはいかがでしょうか。 -- 一ユーザー? 2007-06-27 (水) 22:52:32
  • 現状は、RFC2616 の3.3.1 節にも書かれているRFC822(Obsoleted by RFC2822)の5. 節をベースにしていて、
    その当時は「Sun, 06 Nov 1994 08:49:37 GMT」と「Sun, 06 Nov 1994 08:49:37 +0000」のどちらでもOKだったようですが、
    RFC2822(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. 節を参照)
    header_lastmod() も改修対象になるんですかね。 -- 2009-04-24 (金) 23:14:53
  • Last-modified を出力させる改造例 -- 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 や SERVER_PROTOCOL に応じた分岐がないとかいった問題が残ってますが・・・(HTTP/1.0 にEtag ってあったっけ?RFC:1945 には書いてないし・・・) -- 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.1 304 Not Modified');
        +		exit;
        +	}
        +
         	@readfile($ref);
         	exit;
         }
         ?>
      • rss プラグインの改造例。cvs:plugin/rss.inc.php (r1.21) 80行目あたり
         			break;
         		}
         	}
        +
        +	$size = strlen($page_title . $whatsnew . $lang . $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.1 304 Not Modified');
        +		exit;
        +	}
        +
         	print '<?xml version="1.0" encoding="UTF-8"?>' . "\n\n";
         
         	$r_whatsnew = rawurlencode($whatsnew);
         	switch ($version) {
  • 時刻に戻さず、文字列のままで比較しているので、' +0000'は' GMT'でないと、===にならないようです。 -- 2011-02-28 (月) 15:50:00
  • 良い機会だったので (1)簡易な実装としては、実ファイルのタイムスタンプをそのまま反映するのが簡便。でも移転時のちょっとしたトラブルや、人的な問題で時刻が変わるよ (2)運用の事まで意識すると、メタデータとしてきちんと保管すべき。でも現状のファイル構成だとファイル数が爆発しかねないから気をつけろ という所まで復習しましたzzz -- henoheno 2011-03-01 (火) 00:00:30


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2011-03-01 (火) 00:00:30
Site admin: PukiWiki Development Team

PukiWiki 1.5.2+ © 2001-2019 PukiWiki Development Team. Powered by PHP 5.6.40-0+deb8u7. HTML convert time: 0.298 sec.

OSDN