mod_rewrite RewriteCond, основанный на последней модификации? (.Htaccess) - PullRequest
6 голосов
/ 23 августа 2009

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

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

Заранее спасибо!

Ответы [ 3 ]

9 голосов
/ 23 августа 2009

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

Вот пример сценария 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

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

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 голосов
/ 23 августа 2009

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

0 голосов
/ 23 августа 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...