Pergunta

Eu sei que podemos facilmente basear um RewriteCond em qualquer http pedido cabeçalho. Mas podemos verificar (algumas das) a resposta cabeçalhos que vão ser enviados? Em particular, o Last-Modified um?

Eu quero reescrever uma url somente quando a data da última modificação é mais velho do que 30 minutos e eu estou tentando evitar a sobrecarga de delegar essa verificação para um arquivo php a cada vez que um arquivo a partir desse diretório é solicitado.

Agradecemos antecipadamente!

Foi útil?

Solução

Os cabeçalhos de saída não existir até much mais tarde do que mod_rewrite está agindo. Também não há qualquer funcionalidade check-modificação-tempo de arquivo incorporado mod_rewrite, então o mais próximo que você deseja obter a usá-lo está fazendo um RewriteMap da variedade Programa Reescrevendo externo para descobrir se o arquivo em questão foi modificado.

Se entendi sua aplicação corretamente, você pode também olhar em ter um trabalho cron apagar arquivos no diretório que são mais velhos do que 30 minutos, e depois reescrever em uma condição de arquivo-não-existência.

Outras dicas

Não, isso não é possível. Mas você poderia usar um reescrita mapear para obter essa informação a partir de uma programa com menos sobrecarga do que PHP, talvez um shell script.

Aqui está um exemplo de script 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

A declaração do mapa reescrita necessidades para ser colocado em seu servidor ou arquivo configuraion host virtual que o programa é apenas começou uma vez e, em seguida, aguarda a entrada:

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

E então você pode usar esse mapa reescrita como este (exemplo .htaccess):

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

Você já pensou em usar mod_proxy, mod_cache, e / ou lula? Parece que você está tentando rolar o seu próprio cache ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top