Apache mod_rewrite, usando o URL atual em RewriteCond

1

Eu tenho vários RewriteRules em uma configuração do Apache VirtualHost. Gostaria de poder testar a URL atual (após as reescritas precedentes) em relação a alguma condição. O problema é que a variável% REQUEST_URI é configurada no início do processamento e não é alterada após cada regra. Há muito pouca documentação sobre essas variáveis; existe alguma maneira de usar o RewriteCond para testar o URL atual?

Eu habilitei o registro de reescrita e é aparente que mesmo depois que o primeiro RewriteRule é correspondido e reescrito,% REQUEST_URI ainda está definido como '/'

#Map '/' and '' to '/home'
RewriteRule ^/?$ /home

#Check for cached page
RewriteCond %{DOCUMENT_ROOT}/system/cache%{REQUEST_URI}.html -f
RewriteRule ^(.+)$ /system/cache/$1.html [QSA,L]

Existe alguma maneira simples de conseguir isso?

Editar: Aqui está um trecho do RewriteLog, não acho que uma sub-solicitação interna esteja acontecendo.

(3) applying pattern '^/?$' to uri '/'
(2) rewrite '/' -> '/home'
(3) applying pattern '^([^.]+)$' to uri '/home'
(4) RewriteCond: input='/var/www/vhosts/example.com/subdomains/demo/rails/public/system/cache/.html' pattern='-f' => not-matched
(3) applying pattern '^.*$' to uri '/home'
(4) RewriteCond: input='/var/www/vhosts/example.com/subdomains/demo/rails/public/system/maintenance.html' pattern='-f' => not-matched
(3) applying pattern '^/(.*)$' to uri '/home'
(4) RewriteCond: input='/home' pattern='!-f' => matched
(2) rewrite '/home' -> 'http://127.0.0.1:8100/home'
(2) forcing proxy-throughput with http://127.0.0.1:8100/home
(1) go-ahead with proxy request proxy:http://127.0.0.1:8100/home [OK]
    
por Daniel Beardsley 02.07.2009 / 20:19

2 respostas

2

Você pode acessar o URI "atual" por meio de uma referência anterior. Da documentação do RewriteRule ...

TestString is a string which can contain the following expanded constructs in addition to plain text:

  • RewriteRule backreferences: These are backreferences of the form $N (0 <= N <= 9), which provide access to the grouped parts (in parentheses) of the pattern, from the RewriteRule which is subject to the current set of RewriteCond conditions.

Você pode manipular a barra inicial com mais clareza também - a solicitação URI sempre começa com / . (A menor solicitação que você pode fazer é GET / HTTP/1.0 .) A solução é ...

# Map '/' to '/home'
RewriteRule ^/$ /home

# Check for cached page
RewriteCond %{DOCUMENT_ROOT}/system/cache/$1.html -f
RewriteRule ^/(.+)$ /system/cache/$1.html [QSA,L]
    
por 30.07.2009 / 20:42
1

Pergunta principal: Você não precisa se preocupar com isso. Sim, sua segunda regra não corresponderá à solicitação inicial, mas sua reconfiguração para /home gerará uma subrequização interna, que corresponderá à regra de armazenamento em cache.

Pergunta secundária: usamos $1 quando queremos dizer $1 . :) $0 refere-se a toda a correspondência de padrões, em que $1 se refere ao primeiro grupo de captura (fragmento entre parênteses) dentro da correspondência. (Isso significa que sua segunda regra poderia ser facilmente escrita RewriteRule .+ /system/cache/$0.html . As pessoas geralmente consideram isso menos claro do que usar captura explícita como você está fazendo.)

    
por 02.07.2009 / 20:41