IIS URL重写〜重写端口路径

时间:2018-03-28 05:12:40

标签: iis url-rewriting reverse-proxy

我的情况如下:

我们在一台服务器上有一系列CI服务,例如TeamCity,YouTrack和OctopusDeploy。目前,我们通过DNS名称加端口访问所有这些,例如:

TeamCity:      http://server.company.com
YouTrack:      http://server.company.com:1234
OctopusDeploy: http://server.company.com:5678/octopus

我目前正在调整,以便我们可以通过https访问这些服务。为此,我通过使用IIS URL重写来处理SSL身份验证,将IIS服务器设置为反向代理。这已经奏效,我现在可以通过https://server.company.com

访问TeamCity了

然而,当我在这里时,我还想使用IIS URL Rewrite来美化地址,并且不需要记忆端口号。我想要实现的是以下重定向:

https://server.company.com          -> http://server.company.com (already working)
https://server.company.com/youtrack -> http://server.company.com:1234
https://server.company.com/octopus  -> http://server.company.com:5678/octopus

我已经尝试添加以下规则:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <clear />
                <rule name="ReverseProxyInboundRule2" stopProcessing="true">
                    <match url="^(https://server.company.com/youtrack)(.*)$" />
                    <conditions logicalGrouping="MatchAll" trackAllCaptures="false" />
                    <action type="Rewrite" url="http://server.company.com:1234/{R:2}" />
                </rule>
                <rule name="ReverseProxyInboundRule1" stopProcessing="true">
                    <match url="(.*)" />
                    <conditions logicalGrouping="MatchAny" trackAllCaptures="false">
                        <add input="{PATH}" pattern="youtrack" negate="true" />
                    </conditions>
                    <action type="Rewrite" url="http://server.company.com/{R:1}" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>

...并在IIS管理器中对其进行了测试,该管理器正确识别规则和条件,并返回正确的向后规则。

但是,当我尝试访问https://server.company.com/youtrack时,我被重定向到http://server.company.com/youtrack而不是http://server.company.com:1234。这就像ReverseProxyInboundRule2根本没有评估。

我确信这是一个合乎逻辑的解释,也是一种让它发挥作用的方法。我自己也看不到它。我能做些什么才能做到这一点?

2018年3月30日更新:

好的,所以我想出了一个部分有效的配置。它如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <clear />
                <rule name="Reverse Proxy to TeamCity" stopProcessing="true">
                    <match url="^teamcity/(.*)" />
                    <action type="Rewrite" url="http://server.company.com/{R:1}" />
                </rule>
                <rule name="Reverse Proxy to YouTrack" stopProcessing="true">
                    <match url="^youtrack/(.*)" />
                    <action type="Rewrite" url="http://server.company.com:1234/issues/{R:1}" />
                </rule>
                <rule name="Reverse Proxy to Hub" stopProcessing="true">
                    <match url="^hub/(.*)" />
                    <action type="Rewrite" url="http://server.company.com.de:5678/hub/{R:1}" />
                </rule>
                <rule name="Reverse Proxy to UpSource" stopProcessing="true">
                    <match url="^upsource/(.*)" />
                    <action type="Rewrite" url="http://server.company.com.de:9876/{R:1}" />
                </rule>
                <rule name="Reverse Proxy to Octopus" stopProcessing="true">
                    <match url="^octopus/(.*)" />
                    <action type="Rewrite" url="http://server.company.com:5432/octopus/{R:1}" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>

此配置重定向请求,如下所示:

https://server.company.com          -> http://server.company.com
https://server.company.com/youtrack -> http://server.company.com:1234/issues/
https://server.company.com/hub      -> http://server.company.com:5678/hub/
https://server.company.com/upsource -> http://server.company.com:9876
https://server.company.com/octopus  -> http://server.company.com:5432/octopus/

这适用于八达通。

在集线器上,地址旁边有一个“连接不安全”通知,说“网站的某些部分(例如图像)不安全”。进入页面信息,它在技术细节下的安全选项卡中说连接只是部分加密。但是,页面的其余部分似乎工作正常。

TeamCity和YouTrack更加异想天开。在Chrome上,TeamCity工作正常(有一段时间直到它随机断开连接)但YouTrack发出404错误,而在Firefox上,TeamCity和YouTrack都以不可用的“纯文本”形式显示。

同时,UpSource在任一浏览器上都会发送一个空白页面。

我已经在各种浏览器和机器上对此进行了交叉测试,并得出结论,如果我已经在这些服务器上登录了这些服务的http版本,TeamCity,YouTrack和Hub只会“有点”工作。如果我没有登录,那么我会为TeamCity和YouTrack收到404错误。至于Hub,我尝试使用“POST-Method not supported”消息登录时出现405错误。

因此,我在干净的平板上的上述书面配置的基本结果如下:

TeamCity: 404 Error
YouTrack: 404 Error
Hub:      405 Error on login
UpSource: Blank Page
Octopus:  Working

1 个答案:

答案 0 :(得分:0)

好的,经过大量的来回,我找到了所有这些服务的工作配置:

  • 设置http IIS反向代理
    • 需要在IIS中安装以下模块:
    • 为网址重定向创建网站
    • 使用有效证书为该网站创建https绑定
    • 在[服务器]&gt;下禁用动态内容压缩压缩
    • 转到[服务器]&gt;应用程序请求路由&gt;服务器代理设置并选择☑“启用代理”
    • 确保设置以下值:
      • HTTP版本:通过
      • 超时:120
      • 保留客户端IP以获取以下标头:X-Forwarded-For
      • 内存缓存持续时间:60
      • 查询字符串支持:忽略查询字符串
      • 响应缓冲区:4096
      • 响应缓冲区阈值:0
  • 设置网址重写和相关设置
    • 在[Server]&gt;中添加以下服务器变量URL重写&gt;查看服务器变量
      • HTTP_X_FORWARDED_HOST
      • HTTP_X_FORWARDED_SCHEMA
      • HTTP_X_FORWARDED_PROTO
    • 按如下方式配置web.config:

的web.config:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <clear />
                <rule name="Reverse Proxy to TeamCity" stopProcessing="true">
                    <match url="^teamcity(.*)" />
                    <action type="Rewrite" url="http://server.company.com{R:1}" />
                </rule>
                <rule name="Reverse Proxy to Hub" stopProcessing="true">
                    <match url="^hub(.*)" />
                    <action type="Rewrite" url="http://server.company.com:8082/hub{R:1}" />
                    <serverVariables>
                        <set name="HTTP_X_FORWARDED_HOST" value="{HTTP_HOST}" />
                        <set name="HTTP_X_FORWARDED_SCHEMA" value="https" />
                        <set name="HTTP_X_FORWARDED_PROTO" value="https" />
                    </serverVariables>
                </rule>
                <rule name="Reverse Proxy to YouTrack" stopProcessing="true">
                    <match url="^youtrack(.*)" />
                    <action type="Rewrite" url="http://server.company.com:8080/youtrack{R:1}" />
                    <serverVariables>
                        <set name="HTTP_X_FORWARDED_HOST" value="{HTTP_HOST}" />
                        <set name="HTTP_X_FORWARDED_SCHEMA" value="https" />
                        <set name="HTTP_X_FORWARDED_PROTO" value="https" />
                    </serverVariables>
                </rule>
                <rule name="Reverse Proxy to UpSource" stopProcessing="true">
                    <match url="^upsource(.*)" />
                    <action type="Rewrite" url="http://server.company.com:8081/upsource{R:1}" />
                    <serverVariables>
                        <set name="HTTP_X_FORWARDED_HOST" value="{HTTP_HOST}" />
                        <set name="HTTP_X_FORWARDED_SCHEMA" value="https" />
                        <set name="HTTP_X_FORWARDED_PROTO" value="https" />
                    </serverVariables>
                </rule>
                <rule name="Reverse Proxy to Octopus" stopProcessing="true">
                    <match url="^octopus(.*)" />
                    <action type="Rewrite" url="http://server.company.com:8888/octopus{R:1}" />
                </rule>
                <rule name="Reverse Proxy to Collaboration General" stopProcessing="true">
                    <match url="(.*)" />
                    <action type="Rewrite" url="http://server.company.com/{R:1}" />
                </rule>
            </rules>
        </rewrite>
        <security>
            <requestFiltering>
                <requestLimits maxAllowedContentLength="300000000" maxUrl="6144" maxQueryString="4096" />
            </requestFiltering>
        </security>
    </system.webServer>
</configuration>
  • 按如下方式配置Hub,YouTrack和UpSource
    • 注意:以hub.bat / youtrack.bat / upsource.bat开头的命令需要在相应服务的[Installation Directory]\bin中的相应文件上执行。

CMD:

upsource.bat stop
youtrack.bat stop
hub.bat stop

hub.bat configure --listen-port 8082 --base-url https://server.company.com/hub
youtrack.bat configure --listen-port 8080 --base-url=https://server.company.com/youtrack--hub-url=https://server.company.com/hub/hub
upsource.bat configure --listen-port 8081 --base-url=https://server.company.com/upsource --hub-url=https://server.company.com/hub/hub

hub.bat start
youtrack.bat start
upsource.bat start --J-Dbundle.websocket.compression.enabled=false

注意:我不知道为什么,但是Hub在其基地址之后添加了一个额外的/ hub,这就是为什么UpSource的hub-url设置以/ hub / hub结束。

之后,我需要做的就是将重定向URL添加到服务允许的重定向URL列表中,并在Hub&gt;中更改TeamCity和OctopusDeploy的基本URL。设置&gt;服务,现在一切都很完美。

嗯,几乎完美。每当服务器重新启动时,我都需要手动重启UpSource,因为我还没有找到一种方法来将upsource注册为服务,并使用-J-Dbundle.websocket.compression.enabled = false参数,但除此之外,还有一切效果很好。