A-A+

用Apache反向代理设置开放内网服务器

2008年11月19日 编程开发 暂无评论 阅读 1 次

      由于我的服务器在内网,只开放了1个ip的80端口,其它的端口以及内网其它IP的服务器就没机会对外发布。即是想实现访问www.xxx.com/a,就指向了192.168.0.2;访问www.xxx.com/b,就指向了192.168.0.3。192.168.0.2,192.168.0.3分别是内网的两台服务器。

    服务器是windows平台,没有找到很好的办法,就选用了安装Apache作反向代理服务器。前一段时间设置完成后,出现了“/”斜杠问题。就是用http://www.xxx.com/a/访问没有问题,但是用http://www.xxx.com/a访问,地址会变成http://192.168.0.3,包括下级目录如果最后没有加/,都会变成内网地址,那外网当然访问不到了,麻烦的是网站中有很多最后没有加/的链接。

   今天看了大半天 Apache中文版参考手册,终于找到了解决的办法,总结一下以便备查参考。

1、下载安装apache:
2.23  http://apache.justdn.org/httpd/binaries/win32/apache_2.2.3-win32-x86-no_ssl.msi
2.0.59 http://apache.justdn.org/httpd/binaries/win32/apache_2.0.59-win32-x86-no_ssl.msi

2、配置文件httpd.conf

#去掉下面语句的注释,启用Apache的代理模块
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
#去掉上面面语句的注释,启用Apache的代理模块

3、在配置文件httpd.conf最后添加          hxxp://www.it99.net/blog/article.asp?id=259

 

<IfModule mod_proxy.c>
#配置反向代理并不需要打开ProxyRequests指令;ProxyRequests指令是激活正向代理的。
ProxyRequests off
<Proxy *>    
   Order deny,allow
   Allow from all
</Proxy>
ProxyPass /a http://192.168.0.2/
ProxyPassReverse /a http://192.168.0.2/
ProxyPass /b http://192.168.0.2/
ProxyPassReverse /b http://192.168.0.2/
</IfModule>

 

4、参考手册部分摘录

警告 在您没有对服务器采取安全措施之前,请不要用ProxyRequests启用代理。一个开放的代理服务器不仅对您的网络有威胁,对整个因特网来说也同样如此。Apache可以被配置为正向(forward)反向(reverse)代理。正向代理是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。

正向代理的典型用途是为在防火墙内的局域网客户端提供访问Internet的途径。正向代理还可以使用缓冲特性(由mod_cache提供)减少网络使用率。

使用ProxyRequests指令即可激活正向代理。因为正向代理允许客户端通过它访问任意网站并且隐藏客户端自身,因此你必须采取安全措施以确保仅为经过授权的客户端提供服务。

反向代理正好相反,对于客户端而言它就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理的命名空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端,就像这些内容原本就是它自己的一样。

反向代理的典型用途是将防火墙后面的服务器提供给Internet用户访问。反向代理还可以为后端的多台服务器提供负载平衡,或为后端较慢的服务器提供缓冲服务。另外,还可以启用高级URL策略和管理技术,从而使处于不同web服务器系统的web页面同时存在于同一个URL空间下。

可以使用ProxyPass指令激活反向代理(在RewriteRule指令中使用[P]标记也可以)。配置反向代理并不需要打开ProxyRequests指令。

简单示例
下面的例子仅仅是为了给你一个基本概念而帮助入门而已,请仔细阅读每个指令的文档。
另外,如果想使用缓冲特性,请查看mod_cache文档。

正向代理

ProxyRequests On
ProxyVia On
<Proxy *>
Order deny,allow
Deny from all
Allow from internal.example.com
</Proxy>

 

反向代理

ProxyRequests Off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>

ProxyPass /foo http://foo.example.com/bar
ProxyPassReverse /foo http://foo.example.com/bar

 

解决了“/”斜杠问题就是用下面的指令   hxxp://www.it99.net/blog/article.asp?id=259

ProxyPassReverse 指令

说明 调整由反向代理服务器发送的HTTP应答头中的URL
语法 ProxyPassReverse [path] url
作用域 server config, virtual host, directory
状态 扩展(E)
模块 mod_proxy

此指令使Apache调整HTTP重定向应答中Location, Content-Location, URI头里的URL。这样可以避免在Apache作为反向代理使用时,后端服务器的HTTP重定向造成的绕过反向代理的问题。

只有明确指定的应答头会被重写,其它应答头保持不变,并且HTML页面中的URL也不会被修改。如果被代理的内容包含绝对URL引用,那么将会绕过代理。有一个第三方模块可以检查并改写HTML中的URL引用,该模块就是Nick Kew编写的mod_proxy_html

path是本地虚拟路径的名称。url是远端服务器的部分URL。与ProxyPass指令中的使用方法相同。

例如,假定本地服务器拥有地址http://example.com/ ,那么

ProxyPass /mirror/foo/ http://backend.example.com/
ProxyPassReverse /mirror/foo/ http://backend.example.com/
ProxyPassReverseCookieDomain backend.example.com public.example.com
ProxyPassReverseCookiePath / /mirror/foo/

不仅会把所有对http://example.com/mirror/foo/bar的请求直接转换为对http://backend.example.com/bar的代理请求(由ProxyPass提供的功能),它还会重定向服务器backend.example.com的发送:当http://backend.example.com/bar被它重定向到http://backend.example.com/quux时,Apache会在转交HTTP重定向应答到客户端之前调整它为http://example.com/mirror/foo/quux 。注意:被用于构建URL的主机名与UseCanonicalName指令的设置有关。

注意,此ProxyPassReverse指令亦可与mod_rewrite的代理穿透特性(RewriteRule ... [P])联用。因为它不依赖于相应的ProxyPass指令。

当在<Location>配置段中使用时,第一个参数会被忽略而采用由<Location>指令指定的本地目录。

给我留言

Copyright © 浩然东方 保留所有权利.   Theme  Ality 07032740

用户登录