更新:我添加了一个修改后的问题后,下面两个答案。
你好,
如果你正在阅读,你可能对Apache的mod_proxy及其ProxyPass函数很熟悉。 像其他许多人一样,我有一个可以从内部networking外部访问的应用程序的问题,但是应用程序本身可以访问不同计算机上的其他内部应用程序,并且当您使用此设置进行远程访问时,情况会变得糟糕透顶。
所以,我的设置很简单,我有:
机器#1启用了远程访问,我通过主机名访问它,并且吐出运行在其上的PHP应用程序。
机器#2是一个运行Django的新应用程序,它使用了一个完全不同的后端(甚至authentication),它被托pipe在一个单独的机器上。 在我们的内部网中,我们通过一个简单的命名主机名来访问它,它主要链接到内部的192.168.0.101 ip。
我尝试使用ProxyPass来设置它,例如,传递给/ new将把它发送到新的应用程序:
ProxyPass /新http://192.168.0.101/
这种工作,它获取到其他应用程序的请求,但它打破了,因为我的Django应用程序想redirect到/ auth / login /,它立即无法识别。 如果我自己修改url为foo.net/new/auth/login我得到我的login页面,但是正如你所猜测的,在整个浏览过程中这样做是不方便的。
那么我怎样才能让ProxyPass按照我的意愿工作呢? 我是否需要对Apache做些什么,所以它总是写入/新的URL在其他应用程序之前,或者这是我应该在我的Django应用程序中修改?
任何提示和指针,以及将不胜感激。 谢谢你的时间
您应该修改您的django应用程序,以期在/ new / auth / login而不是/ auth / login。 一般来说你的代理通行证应该是这样的:
ProxyPass /path http://192.168.0.101/path ProxyPassReverse /path http://192.168.0.101/path
结合您的Django应用程序期待在/新/应该解决您的问题。
我相信你可以使用ProxyPassReserve指令来解决这个问题。 你可以在这里阅读。
使用VirtualHost。 例如,将服务器的名称(例如sub.external.com )设置为您的服务器IP(例如123.456.678 )
由于安全性,如果在settings.py中使用ProxyPass,则需要显式转发HTTP_HOST,即每个票据#6880 :
USE_X_FORWARDED_HOST = True
然后将以下内容添加到Apache /etc/httpd/httpd.conf中 :
# Virtual hosts Include /etc/httpd/extra/httpd-vhosts.conf
将你的VirtualHost添加到/etc/httpd/extra/httpd-vhosts.conf :
NameVirtualHosts *:80 <VirtualHost *:80> ServerName sub.external.com ProxyPass / http://127.0.0.1:8000/ </VirtualHost>
感谢您的回应,我正在回答我自己的问题,因为在玩这个之后需要修改一下。
首先,应用程序#2跑掉http://192.168.0.101 ..它不会跑掉http://192.168.0.101/path,以便ProxyPass将不会工作
所以在和一些来自irc的#apache人交谈之后,我发现我需要做这样的事情:
RewriteCond%{HTTP_HOST} ^ app2.myremotedns.com *
RewriteRule。* http://192.168.0.101/ [P]
这样做是发送一个重写规则的任何请求到app2.myremotedns.com被发送到通过代理的内部IP。
这个工作有点但是有三个问题:
在所有页面上都需要login,如果我在app2上远程访问任何东西,它将redirect到/ auth / login ..但是,由于当前的Rewrite设置,在Firefox停止尝试path之前,我得到一个redirect循环。 我想这可能与Django的redirect方法有关,但我不太确定。
如果我禁用login,那么页面的工作types,但不完全。 我似乎能够获取应用程序#2的索引页,但没有其他的东西真的
静态媒体全部坏了,但这可能是一个简单的解决方法..现在不担心它。
所以,我有一个更复杂的问题,然后我想象… 🙂
如果您真的想学习,请阅读反向代理的分步示例。