web.config - IIS下的反向代理

实现IIS环境下,对seafile服务器的反向代理。

web.config - IIS下的反向代理

1 问题由来

从CentOS迁移到了Windows Server,网站服务器也从Nginx换到了IIS。

简单的网站设置,IIS十分简单,而且逻辑清晰,但涉及到地址重写,如:Seafile服务器分别工作在8000和8082端口。要针对Seafile服务服务器建立站点就有些困难,而且Seafile官方文档对Windows Server的介绍很少,只有基本的环境搭建,没有介绍如何在IIS下进行域名绑定等配置。


2 IIS环境配置

首先,实现IIS的地址重写需要在IIS中安装ARRURL重写模块。这两个模块在IIS8中不再是默认安装的,也无法从添加或启用Windows功能中获取。需要自己去微软的网站上下载。我使用了微软的产品在线下载器(Microsoft Web Platform Installer)进行搜索和下载。

Microsoft Web Platform Installer


3 URL地址重写

3.1 IIS管理器内添加规则

使用Windows Server端的IIS管理程序,首先开启ARR,然后再到对应站点中的URL重写模块中去设置入站规则,输入识别入站URL的正则表达式,并编写重写地址。

由于有GUI向导,比起纯手写配置文件还是明显易用,逻辑清晰的。

IIS上的反向代理 - CSDN

在IIS管理器中设置生成的规则实际上也是在站点的Web目录下生成一个web.config文件。

3.2 编写web.config配置文件

直接操作web.config文件可以实现更细致的配置内容。

但网上关于web.config的编写说明少之又少,微软官方MSDN中也没有足够细致到可以阅读文档进行编写的程度。(当然也可能是我没找到)

找到一个老外的博客倒是写了一份基于IIS的Seafile服务器的地址重写:

Seafile HTTPS Install on Windows Server 2012 R2; Step-by-Step

不过老外给出的案例文档有些问题,估计是手误,也可能是没在真实环境中测试过,有些小瑕疵,如:有一处</rule>写成了</rules>,会导致服务器报错,无法正确解析。

以下是我修改后,且测试成功的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<location path="" overrideMode="Deny">
</location>
<system.webServer>
<security>
<requestFiltering allowDoubleEscaping="true" />
</security>
<rewrite>
<rules>
<clear />
<rule name="Redirect to HTTPS" enabled="true" stopProcessing="true">
<match url="(.*)" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
<add input="{HTTPS}" pattern="^OFF$" />
</conditions>
<action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="Permanent" />
</rule>
<rule name="seafilehttp" stopProcessing="true">
<match url="seafhttp/(.*)" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false" />
<action type="Rewrite" url="http://127.0.0.1:8082/{R:1}" appendQueryString="true" logRewrittenUrl="true" />
</rule>
<rule name="seafile" enabled="true" stopProcessing="true">
<match url="(.*)" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false" />
<action type="Rewrite" url="http://127.0.0.1:8000/{R:1}" appendQueryString="true" logRewrittenUrl="true" />
</rule>
</rules>
<outboundRules>
<preConditions>
<preCondition name="ResponseIsHtml1">
<add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/html" />
</preCondition>
</preConditions>
</outboundRules>
</rewrite>
<httpErrors errorMode="DetailedLocalOnly" />
</system.webServer>
</configuration>

根据我查到的资料和理解,做一些补充解释:

  • <?xml version="1.0" encoding="UTF-8"?>
    • 第一行注释形式的文件说明是xml的编写格式规范,以便机器识别
  • web.config文件内容从<configuration>开始,诸如<rewrite>之类的规则包含在<system.webServer>标签内
  • condition 就是IIS管理器中URL重写编辑入站规则条件 选项
  • <action>中的url就是地址重写的重写目标,即从入站时被正则表达式匹配的是源地址,而重写过后即为此处的目的地址。
    • {R:1} 表示入站时,域名后面的参数

4 URL重写与Seafile服务器

4.1 Nginx环境

之前在CentOS上使用的是Nginx通过FastCGI转发seahub网站页面的请求到127.0.0.1的8000端口。

此时的8000端口是不能直接访问的。

4.2 IIS环境

IIS的CGI模块中我没找到如何实现将请求转发到本地端口,只找到了使用本地的可执行文件去处理特定请求。

由于缺少Seafile官方技术文档的支持,我摸索下来的解决方案是Windows Server下则通过IIS的URL重写实现将用户的入站请求重写后,转发到Seafile位于8000端口的网站服务器和位于8082端口的文件服务器。

也就是说,此时的8000端口是一个独立运作的网站,是可以直接访问的。