Apache 反向代理问题, 为什么URL总是自动跳转?

Web、Mail、Ftp、DNS、Proxy、VPN、Samba、LDAP 等基础网络服务
回复
头像
nicegiving
帖子: 125
注册时间: 2008-07-03 19:25
送出感谢: 0
接收感谢: 0

Apache 反向代理问题, 为什么URL总是自动跳转?

#1

帖子 nicegiving » 2010-12-13 22:21

如题,这是个反向代理的问题,我有两台机器:

pc1: ubuntu 10.10, apache 2.2.16, ip_address: 192.168.1.129
pc2: redhat enterprise linux 5.5, apache 2.2.3, ip_address: 192.168.1.197

在pc2上面我建立了一个网站, 现在想在pc1上面通过apache反向代理访问到pc2上的网站上。

首先在pc1上面安装了apache的代理模块:

代码: 全选

$ sudo a2enmod proxy
$ sudo a2enmod proxy_http
然后这是我在pc1上面的第一个配置:

代码: 全选

NameVirtualHost *:80
<VirtualHost *:80>
	ServerAdmin example@example.com
	ProxyPreserveHost on
	ProxyPass /197 http://192.168.1.197/
	ProxyPassReverse /197 http://192.168.1.197/
	DocumentRoot /var/www/html/meta3
    ...
</VirtualHost>
浏览器中通过 http://192.168.1.129/197 访问了 192.168.1.197:/var/www/html目录
浏览器中通过 http://192.168.1.129/ 访问了 192.168.1.129:/var/www/html/meta3目录

上面这个配置一切正常,访问也很顺利, 浏览器中输入的url也并没有改变。

然后下面这个配置就出问题了:

代码: 全选

NameVirtualHost *:80
<VirtualHost *:80>
	ServerAdmin example@example.com
	ProxyPreserveHost on
	ProxyPass /197 http://192.168.1.197/a/b/c/d
	ProxyPassReverse /197 http://192.168.1.197/a/b/c/d
	<proxy http://192.168.1.197/a/b/c/d>
		AllowOverride None
		Order Deny,Allow
		Allow from all
	</proxy>
    DocumentRoot /var/www/html/meta3
    ...
</VirtualHost>
浏览器中通过 http://192.168.1.129/197 访问, 然后URL自动跳到了 http://192.168.1.129/a/b/c/d, 然后提示 "Not Found", 实际上192.168.1.197:/var/www/html/a/b/c/d这个目录里面是有东西的,通过 http://192.168.1.197/a/b/c/d/ 可以正常访问。

我只不过是对代理的目的地做了些改变, 并且设置了权限, 为什么会出现上面的情况呢, URL为什么会自动跳转呢? 我上面的配置有错误吗? :em21
头像
link_01
帖子: 1024
注册时间: 2008-11-05 13:24
送出感谢: 0
接收感谢: 4 次

Re: Apache 反向代理问题, 为什么URL总是自动跳转?

#2

帖子 link_01 » 2010-12-14 13:55

最后面缺个“/”,你试试,好像是这么回事,一年多没动apache了
笔记
-------------------------------------
http://blog.163.com/wqt_1101
头像
nicegiving
帖子: 125
注册时间: 2008-07-03 19:25
送出感谢: 0
接收感谢: 0

Re: Apache 反向代理问题, 为什么URL总是自动跳转?

#3

帖子 nicegiving » 2010-12-14 20:20

link_01 写了:最后面缺个“/”,你试试,好像是这么回事,一年多没动apache了
老兄一语点破!
现在我仍然按照上面的配置,在浏览器中输入: “http://192.168.1.129/197/” (注意网址后面多了一个 "/", 原来自动跳转的时候我输入的是 “http://192.168.1.129/197”, 后面没有那个 "/"),就不会出现那个跳转了, 而且可以正常的访问到 192.168.1.197:/var/www/html/a/b/c/d 这个目录。

那么如何兼容呢,即网址后面加不加 "/" 都一样,总不能强制用户非得添加那个 "/" 吧。

我做了下面的尝试:
[1]
现在我更改上面的配置为如下所示(ProxyPass 和 ProxyPassReverse 后面的 "/197" 现在改成了 "/197/", 即在其第一个参数后面加上 "/"):

代码: 全选

NameVirtualHost *:80
<VirtualHost *:80>
	ServerAdmin zmzhang@mail.systemsbiozju.org
	ProxyPreserveHost on
	ProxyPass /197/ http://192.168.1.197/a/b/c/d
	ProxyPassReverse /197/ http://192.168.1.197/a/b/c/d
	<proxy http://192.168.1.197/a/b/c/d>
		AllowOverride None
		Order Deny,Allow
		Allow from all
	</proxy>
	DocumentRoot /var/www/html/meta3
        ...
</VirtualHost>
结果变成了:
在浏览器中输入: http://192.168.1.129/197 提示“Not Found” 无法访问。
在浏览器中输入: http://192.168.1.129/197/ 又跳转到了http://192.168.1.129/a/b/c/d/, 然后提示“Not Found” 无法访问。

[2]
修改上面的配置如下所示(在ProxyPass和ProxyPassReverse的第二个参数后面添加 "/"):

代码: 全选

zzm@bioinfws-000:~$ more /etc/apache2/sites-available/default
NameVirtualHost *:80
<VirtualHost *:80>
	ServerAdmin zmzhang@mail.systemsbiozju.org
	ProxyPreserveHost on
	ProxyPass /197 http://192.168.1.197/a/b/c/d/
	ProxyPassReverse /197 http://192.168.1.197/a/b/c/d/
	<proxy http://192.168.1.197/a/b/c/d/>
		AllowOverride None
		Order Deny,Allow
		Allow from all
	</proxy>
	DocumentRoot /var/www/html/meta3
        ...
</VirtualHost>
这个配置是正确的,现在我无论在浏览器中输入 “http://192.168.1.129/197” 或者 “http://192.168.1.129/197/” 都可以正常访问了。顺便说下, 将权限配置写成 “<proxy http://192.168.1.197/a/b/c/d/>” 或者 “<proxy http://192.168.1.197/a/b/c/d>” (注意最后面的 "/")不会我上面的访问测试产生影响,至于这两者对访问权限的测试的影响,我没有测试过。

[3]
修改上面的配置如下所示(在ProxyPass和ProxyPassReverse的两个参数后面都加上"/"):

代码: 全选

NameVirtualHost *:80
<VirtualHost *:80>
	ServerAdmin zmzhang@mail.systemsbiozju.org
	ProxyPreserveHost on
	ProxyPass /197/ http://192.168.1.197/a/b/c/d/
	ProxyPassReverse /197/ http://192.168.1.197/a/b/c/d/
	<proxy http://192.168.1.197/a/b/c/d/>
		AllowOverride None
		Order Deny,Allow
		Allow from all
	</proxy>
	DocumentRoot /var/www/html/meta3
        ...
</VirtualHost>
结果变成了:
在浏览器中输入: http://192.168.1.129/197 提示“Not Found” 无法访问。
在浏览器中输入: http://192.168.1.129/197/ 可以正常访问。
头像
link_01
帖子: 1024
注册时间: 2008-11-05 13:24
送出感谢: 0
接收感谢: 4 次

Re: Apache 反向代理问题, 为什么URL总是自动跳转?

#4

帖子 link_01 » 2010-12-15 13:39

代码: 全选

NameVirtualHost *:80
<VirtualHost *:80>
   ServerAdmin zmzhang@mail.systemsbiozju.org
   ProxyPreserveHost on
   ProxyPass /197/ http://192.168.1.197/a/b/c/d/
   ProxyPassReverse /197/ http://192.168.1.197/a/b/c/d/
   <proxy http://192.168.1.197/a/b/c/d/>
      AllowOverride None
      Order Deny,Allow
      Allow from all
   </proxy>
   DocumentRoot /var/www/html/meta3
        ...
</VirtualHost>

代码: 全选

ProxyPass /197/ http://192.168.1.197/a/b/c/d/
ProxyPassReverse /197 http://192.168.1.197/a/b/c/d/
这个保留

代码: 全选

<proxy http://192.168.1.197/a/b/c/d/>
      AllowOverride None
      Order Deny,Allow
      Allow from all
   </proxy>
改成:

代码: 全选

<proxy http://192.168.1.197/a/b/c/d/*>
      AllowOverride None
      Order Deny,Allow
      Allow from all
   </proxy>
如果上面已经没有了问题就下面的步骤就不需要了。
然后激活rewrite模块;
修改或者创建rewrite.conf,目录在mods-enabled下:

代码: 全选

<ifmodule rewrite_module>
rewriteengine on
proxyrequests on
rewriterule /197/^/(.*)$ http://192.168.1.197/a/b/c/d/$1 [p]
</ifmodule>
笔记
-------------------------------------
http://blog.163.com/wqt_1101
回复

回到 “服务器基础应用”