Standortdirektive überschreibt mod_wsgi Skriptalias mount

Standortdirektive überschreibt mod_wsgi Skriptalias mount

Ich bin also ratlos. Ich habe eine Webanwendung, die Django verwendet, und ich verwende mod_wsgi, um sie in Apache zu integrieren. Eine andere Person hat jedoch eine Direktive auf derselben Maschine, die auf einen anderen Server weiterleitet. Die Apache-Konfiguration sieht ungefähr so ​​aus:

Meine App

WSGIScriptAlias /stuff /foo/foo/wsgi.py
WSGIPythonPath /foo
<Directory /foo/foo>
    <Files wsgi.py>
        Order deny,allow
        Allow from all
    </Files>
</Directory>

Seine App

<Location "/">
    Order Allow,Deny
    AllowFromAll
    ProxyPass myotherserver
    ProxyPassReverse myotherserver
</Location>

Leider überschreibt seine Location-Direktive meine Skriptdirektive, und alle meine Anfragen an http/www.bar.com/stuff werden letztendlich weitergeleitet anhttp://www.myotherserver.com/stuffohne das WSGI-Skript auszuführen. Wie kann ich Anfragen an /stuff direkt an Django und nicht an den Proxypass richten, ohne seinen Code durcheinander zu bringen oder seine Implementierung auf dem anderen Server auseinanderzunehmen? Ich habe versucht,

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

<Location "/bat">
    Order Allow,Deny
    AllowFromAll
     ProxyPass myotherserver
     ProxyPassReverse myotherserver
</Location>

Dies stellt meiner Anfrage jedoch ein ungültiges /bat-Verzeichnis voran, wenn sie den anderen Server erreicht, und unterbricht alle Links auf seiner Seite. Ich möchte nicht alle seine Links hacken.

Antwort1

Hier gab es also ein paar Probleme. Als ich mir zunächst die Protokolle auf dem empfangenden Server ansah, stellte ich fest, dass alle weitergeleiteten URLs "/" waren, was dazu führte, dass alle Bilder meines Kollegen beschädigt wurden. Dies lag daran, dass ich die Gruppen im regulären URI-Ausdruck falsch erfasst hatte. Erfassen Sie die Gruppen, indem Sie sie in Klammern setzen.

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

Ich habe etwas ziemlich Wagnisreiches gemacht, das funktioniert, aber ich würde mich über Vorschläge für Alternativen freuen.

<Location "/bat">
    Order Allow,Deny
    AllowFromAll
    RewriteRule /bat/(.*)$ $1 [PT]
    ProxyPass myotherserver
    ProxyPassReverse myotherserver
</Location>

Wenn die eingehende Anfrage nicht mein Unterverzeichnis ist, schreibe ich sie grundsätzlich so um, dass sie ein Unterverzeichnis hat. Ich lasse sie durch, damit sie die nächste Standortanweisung durchläuft. In der Standortanweisung für das neue Unterverzeichnis, /bat, ändere ich sie wieder in den ursprünglichen Zustand und gebe sie an den anderen Server weiter, damit die Adresse erhalten bleibt.

Antwort2

Ich bin auf das gleiche Problem gestoßen.

Entsprechenddieser Thread, Aliasimmer ersetzen WSGIScriptAlias.

Doch lautmodwsgi-Dokumentation, es könnte durch eine Standarddirektive ersetzt werden Alias. Die Lösung für Ihr Problem wäre etwa wie unten. Beachten Sie, dass/Sachenwird definiert vor/

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>

verwandte Informationen