
Então estou frustrado. Tenho um webapp que usa Django e estou usando o mod_wsgi para integrá-lo ao apache. No entanto, outra pessoa possui uma diretiva na mesma máquina que faz proxy para outro servidor. A configuração do apache é aproximadamente:
Meu aplicativo
WSGIScriptAlias /stuff /foo/foo/wsgi.py
WSGIPythonPath /foo
<Directory /foo/foo>
<Files wsgi.py>
Order deny,allow
Allow from all
</Files>
</Directory>
Seu aplicativo
<Location "/">
Order Allow,Deny
AllowFromAll
ProxyPass myotherserver
ProxyPassReverse myotherserver
</Location>
Infelizmente, sua diretiva Location substitui minha diretiva de script e todas as minhas solicitações para http/www.bar.com/stuff acabam sendo encaminhadas parahttp://www.myotherserver.com/stuffsem sequer executar o script wsgi. Como faço requisições para /stuff direto para o django e não para o proxypass sem bagunçar o código dele ou desmontar a implementação dele no outro servidor? Eu tentei fazer
RewriteEngine on
RewriteCond %{REQUEST_URI} ^!/stuff
RewriteRule ^.*$ /bat/$1 [NC,PT]
<Location "/bat">
Order Allow,Deny
AllowFromAll
ProxyPass myotherserver
ProxyPassReverse myotherserver
</Location>
Mas isso acrescenta um diretório /bat inválido à minha solicitação quando chega ao outro servidor e quebra todos os links da página dele. Não quero hackear todos os links dele.
Responder1
Então, houve alguns problemas aqui. Primeiro, olhar nos logs no servidor de recebimento me disse que todos os URLs encaminhados eram "/", resultando na quebra de todas as fotos do meu colega de trabalho. Este foi o resultado de eu capturar os grupos na expressão regular do URI incorretamente. Capture os grupos colocando-os entre parênteses.
RewriteEngine on
RewriteCond %{REQUEST_URI} ^!/stuff
RewriteRule ^(.*)$ /bat/$1 [NC,PT]
Bem, fiz algo bastante duvidoso que funciona, mas gostaria de receber sugestões sobre alternativas.
<Location "/bat">
Order Allow,Deny
AllowFromAll
RewriteRule /bat/(.*)$ $1 [PT]
ProxyPass myotherserver
ProxyPassReverse myotherserver
</Location>
Então, basicamente, se a solicitação recebida não for meu subirectório, eu a reescrevo para que tenha um subdiretório. Eu passo para permitir que ele passe pela próxima diretiva de localização. Na diretiva de localização do novo subdiretório, /bat, eu mudo de volta para o que era e passo para o outro servidor para que o endereço permaneça intacto.
Responder2
Eu passei pelo mesmo problema.
De acordo comeste tópico, Alias
sempre superado WSGIScriptAlias
.
No entanto, de acordo comdocumentação do modwsgi, poderia ser substituída por uma Alias
directiva normalizada. A solução para o seu problema seria algo como abaixo. Observe que/coisaé definido antes/
Alias /stuff /foo/foo/wsgi.py
WSGIPythonPath /foo
<Directory /foo/foo>
<Files wsgi.py>
Options ExecCGI
SetHandler wsgi-script
Order deny,allow
Allow from all
</Files>
</Directory>
<Location "/">
Order Allow,Deny
Allow from all
ProxyPass myotherserver
ProxyPassReverse myotherserver
</Location>