2011-08-10 182 views
7

如何配置apache或nginx服務器使用我選擇的算法(即不涉及inode,mtime或大小)發送Etag頭文件?有沒有其他編譯新的C模塊?自定義etag生成

+0

你有一個使用的情況下,當你需要設定自己的'ETag'爲靜態文件? –

+0

服務於集羣inode和mtime不會相同的版本,大小可能是相同的不同版本 – OrangeDog

+0

Nginx具有內置的Perl,這似乎是一個很好的工作。在沒有鎖定遠程資源(例如數據庫)的情況下,它工作得很好(可靠且快速)。 –

回答

4

在Apache中,ETags are handled as a core feature。 ETag被計算爲幾個值的散列值。您可以使用FileETag指令在httpd.conf.htaccess文件來定義其值在哈希,包括有條件的行爲,但正如你指出,你的選擇僅限於:

  • INode - 你的文件的i節點以字節爲單位
  • 文件
  • All的大小 - - 您的文件從
  • Size服務的服務器的時間戳(以毫秒計) - 它是從
  • MTime服務的特定服務器上的數字一上述
  • None的LL - 沒有以上

如果你想真正的自定義ETag的一代,你肯定是最好的斷寫一個Apache模塊。但是,如果您需要快速修復,則可以通過將請求路由到PHP腳本並在腳本中追加Etag標題來生成自己的標記。這條路線可能看起來像這樣在你的httpd.conf.htaccess文件:

RewriteCond %{REQUEST_FILENAME} \.png$  # This example looks for .png requests 
RewriteRule ^(.*)$ /gentag.php?path=$1 [B] # ...and routes them to a PHP script 

PHP腳本可能是這樣的:

<? 
    $path = $_GET['path']; // Grab the filepath from GET params 
    $cont = file_get_contents($path); // Get file contents to hash 
    $hash = crc32($cont); // Create your own ETag hash however you like 
    header("Etag: $hash"); // Send the custom Etag header 
    echo $cont;    // Dump the file contents to output 
?>