2009-08-23 3 views
7

Я знаю, что мы можем легко создать RewriteCond по любому адресу http . Но можем ли мы проверить (некоторые из) заголовки , которые будут отправлены? В частности, номер Last-modified?mod_rewrite RewriteCond на основе Last-modified? (.htaccess)

Я хочу переписать URL-адрес, только если дата с последним изменением старше 30 минут, и я стараюсь избежать накладных расходов на делегирование этой проверки файлу php каждый раз, когда запрашивается файл из этого каталога.

Заранее благодарен!

ответ

0

Исходящие заголовки не существуют до much, затем действует mod_rewrite. Там также нет никакой функции проверки времени модификации файлов, встроенной в mod_rewrite, поэтому ближе всего к ней вы будете использовать RewriteMap сорта внешней программы перезаписи, чтобы узнать, был ли изменен этот файл.

Если я правильно понимаю ваше приложение, вы также можете посмотреть, как удалить задание cron в этом каталоге старше 30 минут, а затем переписать в состояние несуществования файла.

+0

Yeap, очевидно. Но заголовок Last-modified существует в то время, поэтому я подумал, что, возможно, есть что-то для этого. Я думаю, что нет :-( Что касается cron, это именно то, чего я пытаюсь избежать. –

8

Нет, это невозможно. Но вы можете использовать rewrite map, чтобы получить эту информацию из программы с меньшими затратами, чем PHP, возможно, сценарий оболочки.

Вот пример Баш скрипт:

#!/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 

Декларация карты переписывания должен быть размещен на сервере или виртуального хоста файл настройке программы, как программа только начала один раз, а затем ожидает ввода:

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

И тогда вы можете использовать эту карту как переписать это (.htaccess пример):

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

Хорошее решение, которое я получил. –

+0

Поскольку PHP уже загружен и запущен внутри процесса Apache, его совсем не ясно, что создание нового bash - по одному на запрос - будет быстрее. Думаю, это не так. – derobert

+0

Ничего себе, это умно! Большое спасибо за ваше время. Однако, как насчет возражения Дерберта выше? –

0

Рассматривали ли вы использование mod_proxy, mod_cache и/или squid? Похоже, вы пытаетесь перевернуть свое собственное кэширование ...

+0

Yeap, я пытаюсь кэшировать созданные php/gd изображения и воссоздавать их каждые 30 минут, если необходимо (= если кто-то действительно их запрашивает). Вы думаете, что mod_proxy, mod_cache или squid могут помочь? Я никогда не смотрел на них, чтобы быть откровенным. Я всегда думал, что они предназначены для более сложных вещей. –

+0

Да, вы делаете веб-кеширование , и это именно то, для чего они предназначены. Естественно, вы должны только беспокоиться об этой оптимизации, если это имеет значение (например, у вас есть объем трафика, требующий этого). – derobert