IIS7 反向代理实现方法

反向代理(Reverse Proxy)方式是指以代理服务器来接受 internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给 internet 上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。

反向代理可以启用高级 URL 策略和管理技术,从而使处于不同 web 服务器系统的 web 页面同时存在于同一个 URL 空间下,也可以优化带宽服务器与性能服务器的组合。

通过 IIS 安装反向代理,可以使得 IIS 和 Apache 等服务器运行在同一台机器上,IIS 和 Apache 都可以通过 80 端口访问,使得网站的兼容性更强。

,IIS7以后的版本微软推出了官方的 URL Rewrite 和 Application Request Routing 来实现反向代理。IIS7 实现反向代理的具体步骤如下:

先安装 和 ,只转发到 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.$,入站规则的操作类型为“重写”,重写URL为“https://www.:8080{R:1}”。

出站规则里,点击添加规则,选择空白规则,“名称”随便写,匹配模式选择“响应”,然后就在模式里填写,href=(.*?)www.:8080(.*?),出站规则的操作类型为“重写”,重写数值为“href={R:1}www./{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.:8080(.*?)"/>  
          <action type="Rewrite" value="href={R:1}www./{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.:8080 替换为反向代理的网站,将 www. 替换为公开发布的网站即可。

IIS7 反向代理实现方法

相关文章:

你感兴趣的文章:

标签云: