Estou tentando configurar um vhost para trabalhar com um proxy, mas somente se a solicitação não for para um arquivo estático -- nesse caso, eu gostaria que o Apache o servisse. Aqui está o que estou usando:
<VirtualHost *:80>
ServerName app.local
DocumentRoot "/app/static"
# Serve static files
<Directory "/app/static">
Require all granted
Options Indexes FollowSymLinks
AllowOverride None
</Directory>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^/(.*) http://localhost:8000/$1 [P,L,QSA]
ProxyPreserveHost On
ProxyPass / http://localhost:8000/
ProxyPassReverse / http://localhost:8000/
</VirtualHost>
No entanto, se eu tentar obter app.local/style.css
, essa solicitação ainda será proxy (eu a vejo no log do servidor proxy), apesar do arquivo /app/static/style.css
existir. Como posso fazer com que ele sirva esses arquivos?
Quando você usa diretivas mod_rewrite em um contexto virtualhost, elas são processadas antes que a solicitação tenha sido mapeada para o sistema de arquivos. Consequentemente, a
REQUEST_FILENAME
variável do servidor ainda não foi avaliada e contém simplesmente o caminho de URL relativo à raiz, não o caminho de arquivo absoluto. Então, a condição na sua primeira regra sempre falhará e a condição negada acima sempre será bem-sucedida (a menos que você tenha um caminho de arquivo abs que corresponda ao caminho de URL - improvável).Em vez disso, você pode usar um lookahead (por exemplo,
%{LA-U:REQUEST_FILENAME}
), ou construir manualmente o nome de arquivo absoluto usando as variáveis de servidorDOCUMENT_ROOT
eREQUEST_URI
(URL-path). Por exemplo:Aliás, você não precisa da primeira regra quando tem a segunda, pois elas são mutuamente exclusivas.
Os sinalizadores
L
eQSA
também são supérfluos aqui, poisP
implica queL
a string de consulta e é automaticamente anexada quando você não inclui explicitamente uma string de consulta na substituição .Você também deve remover a
ProxyPass
diretiva, pois isso resultará em cada URL sendo proxy. Você está usando mod_rewrite (com oP
sinalizador) em vez disso para proxyar a solicitação.