Назад | Перейти на главную страницу

Директива местоположения отменяет монтирование псевдонима скрипта 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 отменяет мою директиву 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 к моему запросу, когда он попадает на другой сервер, и разрывает все ссылки на его странице. Я не хочу взламывать все его ссылки.

Я столкнулся с той же проблемой.

В соответствии с эта тема, 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>

Итак, в основном, если входящий запрос не является моей подкаталогом, я переписываю его, чтобы в нем был подкаталог. Я прохожу, чтобы позволить ему пройти следующую директиву местоположения. В директиве местоположения для нового подкаталога / bat я изменяю его обратно на то, что было и передаю другому серверу, чтобы адрес остался неизменным.