将 IIS 中的*所有* HTTP/HTTPS 请求临时重定向到“服务器维护”页面

Jos*_*osh 11 iis windows-server-2008 rewrite redirect iis-7.5

我们有一个 IIS 服务器,用于托管数百个独立的 Web 应用程序,托管这些应用程序的物理数据库服务器将在短时间内脱机进行维护(我们预计只需不到 15 分钟)。

在此期间,我们希望将任何网站的所有流量重定向到“我们目前正在进行维护”页面。

我意识到我可以通过访问每个 Web 应用程序并设置 IIS 重写规则来完成此操作,该规则将用户发送到该应用程序中的所有请求的另一个页面。但是,我们做这件事比做数据库维护要花更长的时间!

我尝试了三件事,但都没有奏效:

全局 IIS 重写规则

我一直在寻找一种简单的方法来将规则应用到所有站点,一举 - 然后能够在一个同样轻松的步骤中“撤消”该规则。到目前为止,我的尝试都没有奏效。我确实尝试将这个重写规则放在我的全局 web.config 中,位于 W:\Windows\Microsoft.NET\Framework64\v4.0.30319\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>
Run Code Online (Sandbox Code Playgroud)

这没有用。我们在 IIS 中运行 .NET 4.0 64 位,但“以防万一”我把同样的东西放在 32 位和 2.0 全局 web.config 文件中,但仍然没有变化。

App_Offline.htm "特殊文件"

我看到的另一个建议是app_offline.htm “特殊”文件,但我们又回到了同样的问题,将这个文件部署到我们所有应用程序的应用程序根目录比实际进行维护需要更长的时间。

IIS 中的“我们离线”站点

我们所有的站点都在 IIS 中使用单个 IP 设置。即使没有 SNA 这也适用于我们,因为我们所有的应用程序共享一个 SSL 证书(它是一个 UCC)。我想到的一件事是,也许我可以在 IIS 中设置一个站点,将所有流量与我们正在使用的 IP 匹配,并且没有指定主机标头值。希望我可以给它一个更高的“优先级”,并且它在启动时会将所有流量与该 IP 匹配,然后任何其他站点都有机会匹配。我可以将该站点设置为为所有请求提供相同的页面,而不管请求 URL 是什么。

在进行维护时启动该站点,并在完成时停止它。

但是,我也无法使其正常工作,因为 IIS 似乎在不太具体之前将 HTTP 请求匹配到更具体的站点。因此,通过省略这个“告诉用户我们离线”站点的主机头值,它不会被匹配,除非请求没有与另一个站点匹配的主机头值。这让我们又回到了同样的问题,即必须手动转到每个 Web 应用程序并执行操作将其脱机,然后在我们完成维护后将其重新联机

有没有简单的方法来实现这一点?看来我们肯定不是第一个遇到这个问题的人。

-乔希

Pet*_*orf 7

我会采用你的第三种方法"We're offline" Site in IIS,假设你命名了它Offline,如果它没有指定主机头,它将服务没有被具有匹配主机头的任何其他站点接收的所有请求。为了防止这种情况,您只需停止所有其他网站。

假设您安装了 IIS 脚本,打开一个提升的 PowerShell:

import-module webadministration
Run Code Online (Sandbox Code Playgroud)

现在您可以停止除离线站点以外的所有站点:

Get-ChildItem IIS:\Sites | Where {$_.Name -ne "Offline"} | Stop-WebSite
Run Code Online (Sandbox Code Playgroud)

当 SQL-Server 备份时,再次启动它们:

Get-ChildItem IIS:\Sites | Where {$_.Name -ne "Offline"} | Start-WebSite
Run Code Online (Sandbox Code Playgroud)

如果您也有 FTP 站点,这些命令将显示错误,因为您无法通过管道将 FTP 站点连接到 Stop-WebSite cmdlet,但它仍然适用于所有网站。

如果您的站点通常不运行,则必须在第二个命令中排除它们,例如:

Where {$_.Name -ne "Offline" -and $_.Name -ne "foobar.com"}
Run Code Online (Sandbox Code Playgroud)

如果你没有安装 IIS 的 PowerShell cmdlet,你可以使用 appcmd.exe 来做同样的事情,不过我已经好几年没用过了。