2009-08-23 27 views
7

Tôi biết rằng chúng tôi có thể dễ dàng tạo một RewriteCond trên bất kỳ tiêu đề http yêu cầu nào. Nhưng chúng tôi có thể kiểm tra (một số) phản hồi tiêu đề sẽ được gửi không? Cụ thể, Sửa đổi lần cuối một?mod_rewrite RewriteCond dựa trên sửa đổi lần cuối? (.htaccess)

Tôi muốn viết lại url chỉ khi ngày sửa đổi cuối cùng cũ hơn 30 phút và tôi đang cố tránh chi phí của ủy quyền kiểm tra tệp php mỗi lần một tệp từ thư mục đó được yêu cầu.

Cảm ơn trước!

Trả lời

0

Các tiêu đề đi không tồn tại cho đến much sau mod_rewrite đang hoạt động. Cũng không có bất kỳ chức năng kiểm tra sửa đổi tệp nào được tích hợp vào mod_rewrite, vì vậy gần nhất bạn muốn sử dụng nó là tạo một RewriteMap của loạt chương trình viết lại bên ngoài để tìm hiểu xem tệp được đề cập đã được sửa đổi chưa.

Nếu tôi hiểu ứng dụng của bạn chính xác, bạn cũng có thể xem xét việc xóa một tệp cron job trong thư mục đó cũ hơn 30 phút, và sau đó viết lại trên một điều kiện không tồn tại tệp.

+0

Yeap, hiển nhiên. Nhưng tiêu đề sửa đổi lần cuối tồn tại vào thời điểm đó, vì vậy tôi nghĩ rằng có lẽ có điều gì đó cho điều đó. Tôi đoán không có :-( Đối với cron, đó là chính xác những gì tôi đang cố gắng tránh. –

8

Không, điều đó là không thể. Nhưng bạn có thể sử dụng một số rewrite map để nhận thông tin đó từ một chương trình có ít chi phí hơn PHP, có thể là một tập lệnh shell.

Dưới đây là một đoạn mã ví dụ bash:

#!/usr/bin/env bash 
while read line; do 
    max_age=${line%%:*} 
    filename=${line#*:} 
    if [[ -f $filename ]]; then 
     lm=$(stat -f %m "$filename") 
     if [[ $(date +%s)-$lm -le $max_age ]]; then 
      echo yes 
     else 
      echo no 
     fi 
    else 
     echo no 
    fi 
done 

Tờ khai bản đồ viết lại cần phải được đặt trong máy chủ của bạn hoặc ảo tập tin configuraion máy chủ như các chương trình chỉ là bắt đầu một lần và sau đó chờ đợi cho đầu vào:

RewriteMap last-modified-within prg:/absolute/file/system/path/to/last-modified-within.sh 

Và sau đó bạn có thể sử dụng bản đồ viết lại như thế này (ví dụ .htaccess):

RewriteCond %{last-modified-within:30:%{REQUEST_FILENAME}} =yes 
RewriteRule ^foo/bar$ - [L] 
RewriteRule ^foo/bar$ script.php [L] 
+0

giải pháp tốt đẹp mà bạn đã có. –

+0

Vì PHP đã được nạp và chạy bên trong tiến trình Apache, nên không rõ ràng rằng việc sinh ra một bash mới - mỗi yêu cầu - sẽ nhanh hơn. Tôi đoán là không. – derobert

+0

Chà, thật thông minh! Cảm ơn rất nhiều thời gian của bạn. Tuy nhiên, những gì về phản đối của derobert ở trên? –

0

Bạn đã cân nhắc sử dụng mod_proxy, mod_cache và/hoặc mực? Có vẻ như bạn đang cố gắng cuộn bộ nhớ đệm của riêng mình ...

+0

Yeap, tôi đang cố gắng để lưu trữ một số hình ảnh php/gd tạo ra và tái tạo chúng mỗi 30 phút, nếu cần thiết (= nếu ai đó thực sự yêu cầu họ) Bạn nghĩ mod_proxy, mod_cache hoặc mực có thể giúp đỡ? Tôi chưa bao giờ thực sự nhìn vào họ thẳng thắn.Tôi luôn nghĩ rằng họ đang cho những điều phức tạp hơn –

+0

Vâng, bạn đang làm bộ nhớ đệm web Và chính xác, bạn chỉ nên quan tâm đến việc tối ưu hóa này nếu nó quan trọng (ví dụ, bạn có khối lượng lưu lượng truy cập để yêu cầu nó). – derobert

Các vấn đề liên quan