全局 IIS 重写规则

全局 IIS 重写规则

我们有一台 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>

这不起作用。我们在 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 应用程序并执行操作以使其离线,然后在维护完成后将其重新联机

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

-乔希

答案1

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

假设您已安装 IIS 脚本,请打开提升的 PowerShell:

import-module webadministration

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

Get-ChildItem IIS:\Sites | Where {$_.Name -ne "Offline"} | Stop-WebSite

当 SQL-Server 恢复后,重新启动它们:

Get-ChildItem IIS:\Sites | Where {$_.Name -ne "Offline"} | Start-WebSite

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

如果您有通常不运行的网站,则必须在第二个命令中将其排除,例如:

Where {$_.Name -ne "Offline" -and $_.Name -ne "foobar.com"}

如果您没有安装 IIS 的 PowerShell cmdlet,您可以使用 appcmd.exe 执行相同操作,尽管我已经多年没有使用过它了。

答案2

我们的所有网站都是在 IIS 中设置并具有单个 IP。

1)拿一个旧台式机,运行 live linux 发行版,给它与 IIS 框相同的 ip,然后执行不是将其连接到网络

2)在实时 Linux 机器上启动 nginx,并按照你的喜好制作停机页面,使用连接到你的笔记本电脑的离线交换机/集线器进行测试

3)拔下 IIS 盒以太网电缆,然后将其插入实时 Linux 盒。

4) 清除交换机上的 mac 地址缓存(或转动电源)。您的停机站点现已上线。

答案3

我知道这已经过时了,但我必须在旧的 Windows 2008 r2 机器上执行此操作。这更多是针对问题标题的回答;关于问题细节,这只是设置“我们处于离线状态IIS 中的站点”。

这不依赖于除 IIS 和静态 HTML 之外的任何东西。IIS 的“HTTP 重定向”功能无法处理您想要的内容,但还有另一种方法可以模拟它。只需将站点的所有“错误页面”更改为指向维护页面即可。是的,这仅当您可以在 IIS 中使用整个“站点”时才有效。

就我的情况而言,站点的根文件夹(例如 c:\InetPub\wwwroot)中有一个“default.htm”文件。因此全部“错误页面”配置为“执行此站点上的 URL”并使用路径“/default.htm”。由于我在文件中使用绝对 URL(即以“/”开头),因此无论公共 URL 看起来如何,其内容都会在浏览器中正确执行。

此配置的最终结果是,任何/所有对网站的请求都会提供我的维护页面的内容。请求是什么并不重要。

另外,请注意,IIS 将通过在根文件夹中生成 web.config 文件来影响此更改。这是它为我创建的:

 <?xml version="1.0" encoding="UTF-8"?>
 <configuration>
     <system.webServer>
         <httpErrors>
             <remove statusCode="502" subStatusCode="-1" />
             <remove statusCode="501" subStatusCode="-1" />
             <remove statusCode="500" subStatusCode="-1" />
             <remove statusCode="412" subStatusCode="-1" />
             <remove statusCode="406" subStatusCode="-1" />
             <remove statusCode="405" subStatusCode="-1" />
             <remove statusCode="404" subStatusCode="-1" />
             <remove statusCode="403" subStatusCode="-1" />
             <remove statusCode="401" subStatusCode="-1" />
             <error statusCode="401" prefixLanguageFilePath="" path="/default.htm" responseMode="ExecuteURL" />
             <error statusCode="403" prefixLanguageFilePath="" path="/default.htm" responseMode="ExecuteURL" />
             <error statusCode="404" prefixLanguageFilePath="" path="/default.htm" responseMode="ExecuteURL" />
             <error statusCode="405" prefixLanguageFilePath="" path="/default.htm" responseMode="ExecuteURL" />
             <error statusCode="406" prefixLanguageFilePath="" path="/default.htm" responseMode="ExecuteURL" />
             <error statusCode="412" prefixLanguageFilePath="" path="/default.htm" responseMode="ExecuteURL" />
             <error statusCode="500" prefixLanguageFilePath="" path="/default.htm" responseMode="ExecuteURL" />
             <error statusCode="501" prefixLanguageFilePath="" path="/default.htm" responseMode="ExecuteURL" />
             <error statusCode="502" prefixLanguageFilePath="" path="/default.htm" responseMode="ExecuteURL" />
         </httpErrors>
     </system.webServer>
 </configuration>

相关内容