
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, Alias
immer 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>