Директива расположения переопределяет псевдоним сценария mod_wsgi
Так что я в тупике. У меня есть веб-приложение, которое использует Django, и я использую mod_wsgi для интеграции его с Apache. Однако другой человек имеет директиву на том же компьютере, которая проксирует другой сервер. Конфигурация apache примерно такая:
Мое приложение
WSGIScriptAlias /stuff /foo/foo/wsgi.py
WSGIPythonPath /foo
<Directory /foo/foo>
<Files wsgi.py>
Order deny,allow
Allow from all
</Files>
</Directory>
Его приложение
<Location "/">
Order Allow,Deny
AllowFromAll
ProxyPass myotherserver
ProxyPassReverse myotherserver
</Location>
К сожалению, его директива Location переопределяет мою директиву сценария, и все мои запросы к http/www.bar.com/stuff заканчиваются тем, что они перенаправляются на http://www.myotherserver.com/stuff даже без выполнения сценария wsgi. Как мне делать запросы к / stuff напрямую к django, а не к proxypass, не испортив его код или не разобрав его реализацию на другом сервере? Я пытался сделать
RewriteEngine on
RewriteCond %{REQUEST_URI} ^!/stuff
RewriteRule ^.*$ /bat/$1 [NC,PT]
<Location "/bat">
Order Allow,Deny
AllowFromAll
ProxyPass myotherserver
ProxyPassReverse myotherserver
</Location>
Но это добавляет неверный каталог /bat к моему запросу, когда он попадает на другой сервер, и разрывает все ссылки на его странице. Я не хочу взламывать все его ссылки.
2 ответа
Я столкнулся с той же проблемой.
Согласно этой теме, Alias
всегда вытесняют WSGIScriptAlias
,
Однако, согласно документации modwsgi, его можно заменить стандартным Alias
директивы. Решение вашей проблемы будет что-то вроде ниже. Обратите внимание, что / вещи определены до /
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>
Итак, здесь было несколько проблем. Во-первых, просмотр журналов на принимающем сервере показал мне, что все пересылаемые URL-адреса были "/", в результате чего все фотографии моего коллеги были нарушены. Это было результатом того, что я неправильно записал группы в регулярном выражении URI. Захватите группы, заключив их в скобки.
RewriteEngine on
RewriteCond %{REQUEST_URI} ^!/stuff
RewriteRule ^(.*)$ /bat/$1 [NC,PT]
Теперь я сделал что-то довольно изворотливое, которое работает, но я бы приветствовал предложения относительно альтернатив.
<Location "/bat">
Order Allow,Deny
AllowFromAll
RewriteRule /bat/(.*)$ $1 [PT]
ProxyPass myotherserver
ProxyPassReverse myotherserver
</Location>
Таким образом, в основном, если входящий запрос не является моим подкаталогом, я переписываю его так, чтобы он имел подкаталог. Я прохожу, чтобы позволить ему пройти через следующую директиву местоположения. В директиве location для нового подкаталога /bat я изменяю его обратно на прежний и передаю другому серверу, чтобы адрес оставался нетронутым.