Apache的设置
<VirtualHost *:80>
ServerAdmin prograsliu@gmail.com
DocumentRoot "D:/www/test"
ServerName www.test.com
ServerAlias test.com
ErrorLog "logs/test.com-error.log"
CustomLog "logs/test.com-access.log" common
Alias /sublook "D:/www/test/look/sublook/"
<Directory "D:/www/test">
Options FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
</Directory>
#反向代理设置
ProxyPass /proxy http://www.proxypass.com/proxy
ProxyPassReverse /proxy http://www.proxypass.com/proxy
</VirtualHost>
<VirtualHost *:80>
ServerAdmin prograsliu@gmail.com
DocumentRoot "D:/www/proxypass"
ServerName www.proxypass.com
ServerAlias proxypass.com
<Directory "D:/www/proxypass">
Options FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
现在看反向代理设置那一段
ProxyPass /proxy http://www.proxypass.com/proxy : 将 www.test.com/proxy 域下的所有请求转发给 www.proxypass.com/proxy 代理,例如 www.test.com/proxy/login.php 会交给 www.proxypass.com/proxy/login.php 代理
ProxyPassReverse /proxy http://www.proxypass.com/proxy:
www.proxypass.com/proxy/login.php 中有如下代码:
<?php
header('Location: http://www.proxypass.com/proxy/result.php');
?>
那么在重定向的时候,Apache会将HTTP请求重新设为 http://www.test.com/proxy/result.php, 这样的作用稍后讲解
www.proxypass.com/proxy/result.php 中有如下代码:
<?php
echo 'in proxypass.com <br>';
?>
浏览器访问效果
访问 www.test.com/proxy/login.php
Apache将请求交给 www.proxypass.com/proxy/login.php 代理,HTTP请求如图:
可以发现其实Request中的请求还是 www.test.com 的,但是它确实是由 www.proxypass.com 来处理的
proxypass.com/proxy/login.php 重定向到 proxypass.com/proxy/result.php
页面显示 in proxypass.com
HTTP请求如图:
也可以看到请求依然是 www.test.com/proxy/result.php
这里就是 ProxyPassReverse 发挥作用的地方,如果不加这个项,重定向后HTTP请求会如下图:
可以发现请求中的GET是 www.proxypass.com 而不是 www.test.com ,这是因为配置了ProxyPassReverse后,proxypass.com/proxy/login.php 在重定向到 proxypass.com/proxy/result.php 时,Apache会将它调整回 test.com/proxy/result.php , 然后Apache再将 test.com/proxy/result.php 代理给 proxypass.com/proxy/result.php,所以说配置了 ProxyPassReverse 后,即使 proxypass.com/proxy 下的程序有重定向到其他 proxypss.com/proxy 的文件的(如 login.php 重定向到 result.php),你也不会在请求中发现 proxypass.com 的影子.
-----------
使用Apache架设正向代理服务器
修改Apache的配置文件使其支持HTTP代理服务器功能。用文本编辑器打开httpd.conf文件。该文件位于Apache安装目录的conf目录下。如果你在安装Apache的时候没有改变安装路径,那么它应当位于/etc/httpd/conf/httpd.conf,首先要添加代理服务器模块。找到下面这几行:
#LoadModule proxy_module modules/mod_proxy.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
去掉前面的#号使相应的模块生效。
然后我们在配置文件中加入下面这一行:
ProxyRequests On
ProxyVia On
ProxyRequests On:开启Apache正向代理
ProxyVia On:控制位于代理服务器链中的代理请求的流向
引用Apache2.2官方文档中对ProxyVia的解释如下:
如果设置为默认值
Off
,将不会采取特殊的处理。如果一个请求或应答包含”
Via:
“头,将不进行任何修改而直接通过。
如果设置为
On
每个请求和应答都会对应当前主机得到一个”
Via:
“头。
如果设置为
Full
,每个产生的”
Via:
“头中都会额外加入Apache服务器的版本,以”
Via:
“注释域出现。
如果设置为
Block
,每个代理请求中的所有”
Via:
“头行都将被删除。且不会产生新的”
Via:
“头。
然后重新启动Apache。可使用命令service httpd restart。这时Apache就是HTTP代理服务器了。打开IE,选择菜单“工具→Internet选项→连接→局域网设置”,选中“为LAN使用代理服务器”,然后在下方的地址中填入127.0.0.1,端口填写80。填好之后确定,此时如果能够通过IE连接到Internet,则说明代理配置正确无误。 (注:此处的端口80是httpd.conf中Listen指令指定的端口号。如果你修改了Listen命令使Apache监听其他端口,那么在IE的设置中也请做相应的改变。另外,如果你使用拨号连接的话,那么请在“工具→Internet选项→连接”中修改相应的拨号连接的代理设置,而不要修改局域网代理设置)
结合虚拟主机设置,可以如下更改
Listen 8088
<VirtualHost *:8088>
ProxyRequests On
</VirtualHost>
这样代理地址应该为127.0.0.1:8088。
接下来我们尝试一下访问控制。编辑httpd.conf,在虚拟主机中加入下面的设置:
<Proxy *>
Order allow,deny
Allow from all
Deny from 127.0.0.1
</Proxy>
此配置的意思是,允许除本地计算机之外的所有计算机访问代理。然后重新启动Apache。再次试图使用IE连接Internet,你会收到类似于下面的信息:
Forbidden
You don't have permission to access http://www.google.com/ on this server.
说明本地计算机已经被禁止使用代理。而相反地,下面的设置:
<Proxy *>
Order deny,allow
Deny from all
Allow from 127.0.0.1
</Proxy>
的意思是,仅允许本地计算机使用代理服务器。
Proxy指令后面的星号表示客户端使用代理服务器访问的目的地址。在上面两个例子中,星号表示所有地址,即禁止/允许使用代理服务器访问所有地址。而如果想仅禁止某一些地址时,可以参考下面的例子:
<Proxy http://www.google.com/>
Order deny,allow
Deny from all
Allow from 127.0.0.1
</Proxy>
<Proxy http://www.yahoo.co.jp/r/*>
Order allow,deny
Allow from all
Deny from 127.0.0.1
</Proxy>
上面这个例子的意思是,仅允许本地计算机访问http://www.google.com/,并且禁止本地计算机对于http://www.yahoo.co.jp/r/下的资源的访问。由于Apache的Proxy指令目前还不能够支持多个目标地址,因此如果你想对多个目标地址做出限制时,必须使用多个Proxy指令。
如果想对所有使用者(而不仅仅是部分使用者)访问某些地址做出限制时,可以使用ProxyBlock的指令:
ProxyBlock microsoft co.jp www.google.com
上面这条指令阻挡了三种目标地址:包含microsoft的地址,包含co.jp的地址,包含www.google.com的地址。但是实际使用IE测试时你会发现,http://www.google.com/和http://www.google.co.kr/(Google韩国站)将都不能访问,而http://www.google.co.kr/并没有满足上面阻挡的规则。这是因为,Apache启动时将对阻挡地址中看起来像是主机名或者域名的字符串进行域名解析,如果解析成功就阻止掉相应的目标IP地址。而www.google.co.kr和www.google.com的IP地址相同,因此www.google.co.kr也同时被阻挡了。另外,由于Apache试图去解析域名,因此当你使用ProxyBlock时,Apache的启动时间会变长。
另外要注意,如果写ProxyBlock *,那么将不能通过该代理服务器来访问任何地址。
最后再介绍一下二级代理。使用Apache可以做二级代理,即让本身已经是代理服务器的Apache通过其他的代理服务器来连接Internet。加入以下指令:
ProxyRemote * http://12.34.56.78:8080
即可让Apache将12.34.56.78:8080作为代理服务器。ProxyRemote指令之后的第一个参数表示协议名称或目标地址,例如:
ProxyRemote ftp http://12.34.56.78:8080 # 对于所有ftp请求使用二级代理
ProxyRemote http://www.google.com/ http://12.34.56.78:8080 # 当访问www.google.com时使用二级代理.
<VirtualHost *:80>
ServerAdmin prograsliu@gmail.com
DocumentRoot "D:/www/test"
ServerName www.test.com
ServerAlias test.com
ErrorLog "logs/test.com-error.log"
CustomLog "logs/test.com-access.log" common
Alias /sublook "D:/www/test/look/sublook/"
<Directory "D:/www/test">
Options FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
</Directory>
#反向代理设置
ProxyPass /proxy http://www.proxypass.com/proxy
ProxyPassReverse /proxy http://www.proxypass.com/proxy
</VirtualHost>
<VirtualHost *:80>
ServerAdmin prograsliu@gmail.com
DocumentRoot "D:/www/proxypass"
ServerName www.proxypass.com
ServerAlias proxypass.com
<Directory "D:/www/proxypass">
Options FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
现在看反向代理设置那一段
ProxyPass /proxy http://www.proxypass.com/proxy : 将 www.test.com/proxy 域下的所有请求转发给 www.proxypass.com/proxy 代理,例如 www.test.com/proxy/login.php 会交给 www.proxypass.com/proxy/login.php 代理
ProxyPassReverse /proxy http://www.proxypass.com/proxy:
www.proxypass.com/proxy/login.php 中有如下代码:
<?php
header('Location: http://www.proxypass.com/proxy/result.php');
?>
那么在重定向的时候,Apache会将HTTP请求重新设为 http://www.test.com/proxy/result.php, 这样的作用稍后讲解
www.proxypass.com/proxy/result.php 中有如下代码:
<?php
echo 'in proxypass.com <br>';
?>
浏览器访问效果
访问 www.test.com/proxy/login.php
Apache将请求交给 www.proxypass.com/proxy/login.php 代理,HTTP请求如图:
可以发现其实Request中的请求还是 www.test.com 的,但是它确实是由 www.proxypass.com 来处理的
proxypass.com/proxy/login.php 重定向到 proxypass.com/proxy/result.php
页面显示 in proxypass.com
HTTP请求如图:
也可以看到请求依然是 www.test.com/proxy/result.php
这里就是 ProxyPassReverse 发挥作用的地方,如果不加这个项,重定向后HTTP请求会如下图:
可以发现请求中的GET是 www.proxypass.com 而不是 www.test.com ,这是因为配置了ProxyPassReverse后,proxypass.com/proxy/login.php 在重定向到 proxypass.com/proxy/result.php 时,Apache会将它调整回 test.com/proxy/result.php , 然后Apache再将 test.com/proxy/result.php 代理给 proxypass.com/proxy/result.php,所以说配置了 ProxyPassReverse 后,即使 proxypass.com/proxy 下的程序有重定向到其他 proxypss.com/proxy 的文件的(如 login.php 重定向到 result.php),你也不会在请求中发现 proxypass.com 的影子.
-----------
使用Apache架设正向代理服务器
修改Apache的配置文件使其支持HTTP代理服务器功能。用文本编辑器打开httpd.conf文件。该文件位于Apache安装目录的conf目录下。如果你在安装Apache的时候没有改变安装路径,那么它应当位于/etc/httpd/conf/httpd.conf,首先要添加代理服务器模块。找到下面这几行:
#LoadModule proxy_module modules/mod_proxy.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
去掉前面的#号使相应的模块生效。
然后我们在配置文件中加入下面这一行:
ProxyRequests On
ProxyVia On
ProxyRequests On:开启Apache正向代理
ProxyVia On:控制位于代理服务器链中的代理请求的流向
引用Apache2.2官方文档中对ProxyVia的解释如下:
如果设置为默认值
Off
,将不会采取特殊的处理。如果一个请求或应答包含”
Via:
“头,将不进行任何修改而直接通过。
如果设置为
On
每个请求和应答都会对应当前主机得到一个”
Via:
“头。
如果设置为
Full
,每个产生的”
Via:
“头中都会额外加入Apache服务器的版本,以”
Via:
“注释域出现。
如果设置为
Block
,每个代理请求中的所有”
Via:
“头行都将被删除。且不会产生新的”
Via:
“头。
然后重新启动Apache。可使用命令service httpd restart。这时Apache就是HTTP代理服务器了。打开IE,选择菜单“工具→Internet选项→连接→局域网设置”,选中“为LAN使用代理服务器”,然后在下方的地址中填入127.0.0.1,端口填写80。填好之后确定,此时如果能够通过IE连接到Internet,则说明代理配置正确无误。 (注:此处的端口80是httpd.conf中Listen指令指定的端口号。如果你修改了Listen命令使Apache监听其他端口,那么在IE的设置中也请做相应的改变。另外,如果你使用拨号连接的话,那么请在“工具→Internet选项→连接”中修改相应的拨号连接的代理设置,而不要修改局域网代理设置)
结合虚拟主机设置,可以如下更改
Listen 8088
<VirtualHost *:8088>
ProxyRequests On
</VirtualHost>
这样代理地址应该为127.0.0.1:8088。
接下来我们尝试一下访问控制。编辑httpd.conf,在虚拟主机中加入下面的设置:
<Proxy *>
Order allow,deny
Allow from all
Deny from 127.0.0.1
</Proxy>
此配置的意思是,允许除本地计算机之外的所有计算机访问代理。然后重新启动Apache。再次试图使用IE连接Internet,你会收到类似于下面的信息:
Forbidden
You don't have permission to access http://www.google.com/ on this server.
说明本地计算机已经被禁止使用代理。而相反地,下面的设置:
<Proxy *>
Order deny,allow
Deny from all
Allow from 127.0.0.1
</Proxy>
的意思是,仅允许本地计算机使用代理服务器。
Proxy指令后面的星号表示客户端使用代理服务器访问的目的地址。在上面两个例子中,星号表示所有地址,即禁止/允许使用代理服务器访问所有地址。而如果想仅禁止某一些地址时,可以参考下面的例子:
<Proxy http://www.google.com/>
Order deny,allow
Deny from all
Allow from 127.0.0.1
</Proxy>
<Proxy http://www.yahoo.co.jp/r/*>
Order allow,deny
Allow from all
Deny from 127.0.0.1
</Proxy>
上面这个例子的意思是,仅允许本地计算机访问http://www.google.com/,并且禁止本地计算机对于http://www.yahoo.co.jp/r/下的资源的访问。由于Apache的Proxy指令目前还不能够支持多个目标地址,因此如果你想对多个目标地址做出限制时,必须使用多个Proxy指令。
如果想对所有使用者(而不仅仅是部分使用者)访问某些地址做出限制时,可以使用ProxyBlock的指令:
ProxyBlock microsoft co.jp www.google.com
上面这条指令阻挡了三种目标地址:包含microsoft的地址,包含co.jp的地址,包含www.google.com的地址。但是实际使用IE测试时你会发现,http://www.google.com/和http://www.google.co.kr/(Google韩国站)将都不能访问,而http://www.google.co.kr/并没有满足上面阻挡的规则。这是因为,Apache启动时将对阻挡地址中看起来像是主机名或者域名的字符串进行域名解析,如果解析成功就阻止掉相应的目标IP地址。而www.google.co.kr和www.google.com的IP地址相同,因此www.google.co.kr也同时被阻挡了。另外,由于Apache试图去解析域名,因此当你使用ProxyBlock时,Apache的启动时间会变长。
另外要注意,如果写ProxyBlock *,那么将不能通过该代理服务器来访问任何地址。
最后再介绍一下二级代理。使用Apache可以做二级代理,即让本身已经是代理服务器的Apache通过其他的代理服务器来连接Internet。加入以下指令:
ProxyRemote * http://12.34.56.78:8080
即可让Apache将12.34.56.78:8080作为代理服务器。ProxyRemote指令之后的第一个参数表示协议名称或目标地址,例如:
ProxyRemote ftp http://12.34.56.78:8080 # 对于所有ftp请求使用二级代理
ProxyRemote http://www.google.com/ http://12.34.56.78:8080 # 当访问www.google.com时使用二级代理.
No comments:
Post a Comment