反向代理(Reverse Proxy)方式是指以代理服务器来接受 internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给 internet 上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。
反向代理可以启用高级 URL 策略和管理技术,从而使处于不同 web 服务器系统的 web 页面同时存在于同一个 URL 空间下,也可以优化带宽服务器与性能服务器的组合。
通过 IIS 安装反向代理,可以使得 IIS 和 Apache 等服务器运行在同一台机器上,IIS 和 Apache 都可以通过 80 端口访问,使得网站的兼容性更强。
IIS6 中我们需要通过第三方工具 ISAPI Rewrite 来实现反向代理,IIS7以后的版本微软推出了官方的 URL Rewrite 和 Application Request Routing 来实现反向代理。IIS7 实现反向代理的具体步骤如下:
先安装 URL Rewrite 和 Application Request Routing ,只转发到 IIS 内网站,则不需要安装后者。安装完成后,再安装一个 Apache 服务器,Apache 安装完成后,设置 HTTP 端口为 8080,HTTPS 端口4433,而 IIS 的 HTTP 端口为 80,HTTPS 端口 443,IIS 和 Apache 的端口不能冲突。
好以上两个插件,重启 IIS 管理器,然后点击当前主机,就会发现两个新增的图标了。
点击 Application Request Routing 图标,选择 Server Proxy Settings ,勾上 Enable proxy 并点击右侧的应用。
选择需要反向代理的站点,再选择“URL重写”,然后配置入站规则和出站规则。
入站规则里,点击添加规则,选择空白规则,“名称”随便写,选择“与模式匹配”,然后就在匹配 URL 里填个模式,^(.*),“条件输入”填写“{HTTP_HOST}”,模式为^www.02405.com$,入站规则的操作类型为“重写”,重写URL为“https://www.02405.com:8080{R:1}”。
出站规则里,点击添加规则,选择空白规则,“名称”随便写,匹配模式选择“响应”,然后就在模式里填写,href=(.*?)www.02405.com:8080(.*?),出站规则的操作类型为“重写”,重写数值为“href={R:1}www.02405.com/{R:2}”。
填好了保存下,即可完成IIS7的反向代理配置。
不过,上述方法在针对压缩网页的反向代理会报错,IIS 会提示:
HTTP 错误 500.52 – URL Rewrite Module Error.
Outbound rewrite rules cannot be applied when the content of the HTTP response is encoded (”gzip”).
解决方法可以参考微软官方的解决方案,里面详细描述了解决方法,我这里概括一下操作如下:
点击“查看服务器变量”,点“添加”,增加两个变量,分别是 HTTP_ACCEPT_ENCODING 和 HTTP_X_ORIGINAL_ACCEPT_ENCODING 。
之后编辑 web.config 文件,内容如下:
<configuration> <system.webServer> <rewrite> <rules> <rule name="ReverseProxyInboundRule1" enabled="true"> <match url="^(.*)"/> <action type="Rewrite" url="https://www.williamlong.info:8080{R:1}"/> <serverVariables> <set name="HTTP_X_ORIGINAL_ACCEPT_ENCODING" value="{HTTP_ACCEPT_ENCODING}"/> <set name="HTTP_ACCEPT_ENCODING" value=""/> </serverVariables> </rule> </rules> <outboundRules> <rule name="ReverseProxyOutboundRule1" preCondition="ResponseIsHtml1" enabled="true"> <match filterByTags="None" pattern="href=(.*?)www.02405.com:8080(.*?)"/> <action type="Rewrite" value="href={R:1}www.02405.com/{R:2}"/> </rule> <rule name="Restore-AcceptEncoding" preCondition="NeedsRestoringAcceptEncoding"> <match serverVariable="HTTP_ACCEPT_ENCODING" pattern="^(.*)"/> <action type="Rewrite" value="{HTTP_X_ORIGINAL_ACCEPT_ENCODING}"/> </rule> <preConditions> <preCondition name="ResponseIsHtml1"> <add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/html"/> </preCondition> <preCondition name="NeedsRestoringAcceptEncoding"> <add input="{HTTP_X_ORIGINAL_ACCEPT_ENCODING}" pattern=".+"/> </preCondition> </preConditions> </outboundRules> </rewrite> </system.webServer> </configuration>
注意,上述内容以本站域名示例,实际使用的时候请替换为你的网址,将 www.02405.com:8080 替换为反向代理的网站,将 www.02405.com 替换为公开发布的网站即可。