A diretiva de localização substitui a montagem do alias do script mod_wsgi

A diretiva de localização substitui a montagem do alias do script mod_wsgi

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, Aliassempre superado WSGIScriptAlias.

No entanto, de acordo comdocumentação do modwsgi, poderia ser substituída por uma Aliasdirectiva 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>

informação relacionada