
Итак, я в тупике. У меня есть веб-приложение, которое использует 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 переопределяет мою директиву script, и все мои запросы к 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 к моему запросу, когда он попадает на другой сервер, и ломает все ссылки на его странице. Я не хочу идти и взламывать все его ссылки.
решение1
Итак, здесь было несколько проблем. Во-первых, просмотр журналов на принимающем сервере показал, что все пересылаемые 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>
Итак, по сути, если входящий запрос не является моим подкаталогом, я переписываю его так, чтобы у него был подкаталог. Я прохожу, чтобы позволить ему пройти через следующую директиву местоположения. В директиве местоположения для нового подкаталога, /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>