A Diretiva de Localização sobrescreve o alias do script mod_wsgi

2

Então eu estou frustrado. Eu tenho um webapp que usa o Django e estou usando mod_wsgi para integrá-lo com o apache. No entanto, outra pessoa tem 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, a diretiva Location dele sobrepõe-se à minha diretiva de script, e todos os meus pedidos para http / www.bar.com / stuff acabam sendo encaminhados para link sem executar o script wsgi. Como eu faço pedidos para / stuff direto ao django e não ao proxypass sem atrapalhar seu código ou desmembrar sua implementação 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 preenche um diretório inválido / bat no meu pedido quando chega ao outro servidor e quebra todos os links em sua página. Eu não quero hackear todos os links dele.

    
por Rokujolady 16.10.2012 / 20:04

2 respostas

1

Então, houve alguns problemas aqui. Primeiro, olhando nos logs do servidor de recebimento, disse-me que todos os URLs enviados 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 URI errado. Capture os grupos colocando-os entre parênteses.

RewriteEngine on
RewriteCond %{REQUEST_URI} ^!/stuff
RewriteRule ^(.*)$ /bat/$1 [NC,PT]

Agora, fiz algo um tanto desonesto 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 o pedido de incomming não for meu subirectory, eu o reescrevo para que ele tenha um subdiretório. Eu passo para permitir que ele passe pela próxima diretiva de localização. Na diretiva de localização para o novo subdiretório, / bat, mudo de volta para o que era e o transmito para o outro servidor para que o endereço permaneça intacto.

    
por 17.10.2012 / 02:22
1

Eu encontrei o mesmo problema.

De acordo com este tópico , Alias sempre superou WSGIScriptAlias .

No entanto, de acordo com a documentação do modwsgi , ela pode ser substituída por um padrão Alias directiva. Solução para o seu problema seria algo como abaixo. Note que / stuff é definido antes de /

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>
    
por 29.08.2014 / 15:43