2011-08-10 39 views
7

Làm cách nào để định cấu hình máy chủ apache hoặc nginx để gửi tiêu đề Etag bằng thuật toán tôi chọn (tức là không liên quan đến inode, mtime hoặc size)? Có cách nào khác để biên dịch mô-đun C mới không?Tạo etag tùy chỉnh

+0

Bạn đã có một trường hợp sử dụng khi bạn cần phải thiết lập riêng 'ETag' cho tệp tĩnh? –

+0

Phục vụ từ một cụm - inode và mtime sẽ không giống nhau cho cùng một phiên bản, kích thước có thể giống nhau cho các phiên bản khác nhau – OrangeDog

+0

Nginx đã tích hợp sẵn Perl, điều này có vẻ là một công việc tốt cho nó. Nó hoạt động rất tốt (đáng tin cậy và nhanh chóng) trong các tình huống khi bạn không có khóa trên tài nguyên từ xa (ví dụ: cơ sở dữ liệu). –

Trả lời

4

Trong Apache, ETags are handled as a core feature. ETag được tính như một giá trị băm của một vài giá trị. Bạn có thể sử dụng các chỉ thị FileETag tại của bạn tập tin httpd.conf hoặc .htaccess để xác định hành vi có điều kiện mà các giá trị đưa vào băm, nhưng khi bạn chỉ ra, lựa chọn của bạn được giới hạn:

  • INode - i-node của tập tin của bạn số trên máy chủ cụ thể nó phục vụ từ
  • MTime - dấu thời gian (trong millis) của máy chủ tập tin của bạn được phục vụ từ
  • Size - kích thước của tập tin của bạn bằng byte
  • All - một ll những điều trên
  • None - không có ở trên

Nếu bạn muốn thế hệ ETag thực sự tùy chỉnh, bạn chắc chắn sẽ được giảm giá tốt nhất viết một module Apache. Tuy nhiên, nếu bạn cần sửa chữa nhanh chóng và bẩn, bạn có thể tạo thẻ của riêng mình bằng cách định tuyến các yêu cầu của bạn tới tập lệnh PHP và thêm tiêu đề Etag vào tập lệnh. Các tuyến đường có thể trông như thế này trong httpd.conf hoặc .htaccess bạn file:

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

Các kịch bản PHP có thể trông như thế này:

<? 
    $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 
?>