我们有一台IIS服务器,它承载数百个单独的Web应用程序,并且承载这些应用程序的物理数据库服务器将在短期内脱机进行维护(我们预计将花费不到15分钟的时间)。
在此期间,我们希望将任何网站的所有流量重定向到“我们正在接受维护”页面。
我意识到我可以通过转到每个Web应用程序并设置IIS重写规则将用户发送到该应用程序中所有请求的另一个页面的方式来做到这一点。但是,与数据库维护相比,这样做需要更长的时间!
我已经尝试了三件事,但都没有奏效:
全局IIS重写规则
我一直在寻找一种简单的方法,可以一口气将规则应用到所有站点,然后能够以同样轻松的步骤“撤消”该规则。到目前为止,我的尝试都没有成功。我确实尝试将此重写规则放在W:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ Config \ web.config的全局web.config中:
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="redirect all requests" stopProcessing="true">
<match url="^(.*)$" ignoreCase="false" />
<conditions logicalGrouping="MatchAll">
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" pattern="" ignoreCase="false" />
</conditions>
<action type="Redirect" url="http://www.somedomain.com/maintenance" appendQueryString="true" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
这没用。我们正在IIS中运行.NET 4.0 64位,但是为了以防万一,我将32位和2.0全局web.config文件放在同一位置,并且仍然没有变化。
App_Offline.htm“特殊文件”
我看到的另一个建议是app_offline.htm“特殊”文件,但我们又遇到了同样的问题,即将该文件部署到我们所有应用程序的应用程序根目录所需的时间比实际执行维护所需的时间更长。
IIS中的“我们处于脱机状态”站点
我们所有的站点都通过一个IP在IIS中设置。即使没有SNA,这也对我们有用,因为我们所有的应用程序都共享一个SSL证书(这是UCC)。我想到的一件事是,也许我可以在IIS中设置一个站点,该站点将所有流量与我们正在使用的IP匹配,并且未指定主机头值。希望我可以给它一个更高的“优先级”,并让它在启动时将所有流量与该IP匹配,然后再与其他任何站点进行匹配。我可以将该站点设置为为所有请求提供相同的页面,而不考虑请求URL。
进行维护时启动该站点,并在完成后停止该站点。
但是,我也无法使它正常工作,因为IIS似乎先将HTTP请求匹配到更具体的站点,然后再将其具体化。因此,通过忽略此“告诉我们我们处于离线状态”的网站的主机标头值,除非请求没有与另一个网站相匹配的主机标头值,否则它不会被匹配。这使我们回到了同样的问题,即必须手动转到每个Web应用程序并执行操作以使其脱机,然后在完成维护后使其重新联机
有没有简单的方法可以做到这一点?看来我们当然不是第一个遇到此问题的人。
-乔什