因此,我在 abc.com 服务器上创建了一个反向代理,其中 xyz.com/users/sign_in 将代理“/users/sign_in”,以便在 URL 中显示 abc.com/users/sign_in。这在 ubuntu 和 apache2 中运行良好。在 ubuntu 中启用代理后,我像这样设置我的虚拟主机:
<VirtualHost *:80>
ServerAdmin webmaster@localhost
ServerName abc.com
ServerAlias www.abc.com
DocumentRoot /var/www/vhosts/abc.com/public_html
<Directory /var/www/vhosts/abc.com/public_html/>
Options FollowSymLinks MultiViews
AllowOverride All
</Directory>
ProxyRequests Off
<Proxy *>
Order deny,allow
Deny from all
Allow from all
</Proxy>
ProxyPass /users/sign_in http://xyz.com/users/sign_in
ProxyPassReverse /users/sign_in http://xyz.com/users/sign_in
ErrorLog /var/log/apache2/abc.com-error.log
LogLevel warn
CustomLog /var/log/apache2/abc.com-access.log combined
</VirtualHost>
现在问题来了。/users/sign_in 在另一台服务器(xyz 服务器)上发出发布请求,也就是说,它是一个实际提交的表单,而另一台服务器上的代码将用户重定向到网站的根目录。以下是来自另一台服务器的日志:
Started POST "/users/sign_in" for IPADDRESS at 2012-02-22 14:59:13 -0500
Processing by Users::SessionsController#create as HTML
Parameters: {"utf8"=>"✓", "remote"=>"true", "commit"=>"Login", "user"=>{"email"=>"[email protected]", "password"=>"[FILTERED]", "subdomain"=>"", "remember_me"=>"0"}}
Redirected to http://abc.com/
Completed 302 Found in 110ms
所以从表面上看,这其实是件好事。另一台服务器做出响应,让用户登录,然后将他们重定向到根 URL。问题是他们没有被重定向到根 URL:xyz.com(其中包含我希望他们看到的应用程序代码)。相反,他们被重定向到另一台服务器 abc.com。
但是,如果我在 abc.com 服务器中除了 xyz.com/users/sign_in 之外还为 xyz.com 添加代理,那么我就会遇到一个大问题。浏览器如何知道用户何时想要查看 abc.com(实际站点内容)和 xyz.com(调用 /users/sign_in 后我想要加载的应用程序)。
我完全被这个问题难住了,愿意接受任何建议。
答案1
嗯 - 有趣的部署,试试看。xyz
如果客户端发送_session_id
cookie,这将代理所有请求到服务器。
RewriteEngine On
RewriteCond %{HTTP_COOKIE} _session_id=.+ [NC]
RewriteRule ^/(.*)$ http://xyz.com/$1 [P,L]
ProxyPassReverse / http://xyz.com/
将其放在您现有的ProxyPassReverse
配置之下;该顺序对于指令来说很重要ProxyPass
。
这看起来非常脆弱 - 我相信你这样做是有理由的,但是没有其他方法可以分离此应用程序的经过身份验证的部分和未经身份验证的部分吗?
编辑:要提供xyz
内容,请执行/tracking
以下操作:
ProxyPass /users/sign_in http://xyz.com/users/sign_in
ProxyPassReverse /users/sign_in http://xyz.com/users/sign_in
ProxyPass /tracking/ http://xyz.com/
ProxyPassReverse /tracking/ http://xyz.com/