7
如何配置apache或nginx服務器使用我選擇的算法(即不涉及inode,mtime或大小)發送Etag頭文件?有沒有其他編譯新的C模塊?自定義etag生成
如何配置apache或nginx服務器使用我選擇的算法(即不涉及inode,mtime或大小)發送Etag頭文件?有沒有其他編譯新的C模塊?自定義etag生成
在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
?>
你有一個使用的情況下,當你需要設定自己的'ETag'爲靜態文件? –
服務於集羣inode和mtime不會相同的版本,大小可能是相同的不同版本 – OrangeDog
Nginx具有內置的Perl,這似乎是一個很好的工作。在沒有鎖定遠程資源(例如數據庫)的情況下,它工作得很好(可靠且快速)。 –