ASP.NET 用于重定向许多 URL 的站点在重定向带有词干的 URL 时失败 404

ASP.NET site for redirecting many URLs fails 404 when redirecting URLs with stems

.net 4.8、VS 2019、VB.NET、IIS 10 运行 在 Azure 中的 Windows 2016 VM 上。

我最近重新设计了我的网站。我有很多域名,过不了这个问题

我在SQL服务器中设置了一个table。示例数据:

SiteRedirectorID ServerName UrlForNoStem UrlForPreservedStem
1 arf.com [h t t p s : / / (example dot com)/arf.html] [h t t p s : / / (example dot com)/]
2 ribbit.com [h t t p s : / / (example dot com)/frognoise.html] [h t t p s : / / (example dot com)/]
3 meow.com [h t t p s : / / (example dot com)/meow.html] [h t t p s : / / (example dot com)/]
4 trumpet.com [h t t p s : / / (example dot com)/elephants] [h t t p s : / / (example dot com)/]
5 www.bowwow.com [h t t p s : / / (example dot com)/] [h t t p s : / / (example dot com)/]

这里所有的服务器名称都绑定到应用程序,但是Url命名列中的服务器在不同的应用程序上,也许是不同的机器上.

除了 global.asax 之外,重定向器应用程序没有任何代码,这里是所有代码。 Default.aspx 存在但为空且无代码隐藏。

Sub Application_BeginRequest(ByVal sender As Object, ByVal e As EventArgs)
    Dim uCurrent As Uri = HttpContext.Current.Request.Url
    Dim sReqHost As String = uCurrent.Host
    Dim sReqUrl As String = uCurrent.AbsolutePath.Trim()
    Dim sFullTail As String = uCurrent.PathAndQuery.Trim()
    Dim sSearchHost As String = sReqHost.ToLower()
    If sSearchHost.StartsWith("www.") Then
        sSearchHost = sSearchHost.Replace("www.", "")
    End If
    If sSearchHost.StartsWith("ww.") Then
        sSearchHost = sSearchHost.Replace("ww.", "")
    End If
    If sSearchHost.StartsWith("w.") Then
        sSearchHost = sSearchHost.Replace("w.", "")
    End If
    Dim sConn As String = ConfigurationManager.ConnectionStrings("WS").ToString
    Using DS As New DataSet()
        Using Conn As New SqlClient.SqlConnection(sConn)
            Conn.Open()
            Dim sSQL As String = "select * from [SiteRedirector] where [ServerName] = @ServerName; "
            Using Cmd As New SqlClient.SqlCommand(sSQL, Conn)
                Cmd.Parameters.Add("@ServerName", SqlDbType.VarChar).Value = sSearchHost
                Using DA As New SqlClient.SqlDataAdapter(Cmd)
                    Dim iRet As Integer = DA.Fill(DS)
                End Using
            End Using
            Conn.Close()
        End Using
        If DS.Tables.Count < 1 OrElse DS.Tables(0).Rows.Count < 1 Then ' dead link
            Response.Redirect("https://example.com/404.aspx")
        End If
        Dim sTarget As String = ""
        If sFullTail.Trim() = "/" OrElse sFullTail.Trim() = "" Then
            sTarget = DS.Tables(0).Rows(0)("URLForNoStem").ToString.Trim()
        Else
            sTarget = DS.Tables(0).Rows(0)("URLForPreservedStem").ToString.Trim()
            If sTarget.EndsWith("/") AndAlso sFullTail.StartsWith("/") Then
                sTarget &= sFullTail.Trim().Substring(1, sFullTail.Length - 1)
            Else
                sTarget &= sFullTail.Trim()
            End If
        End If
        Server.ClearError()
        Response.Clear()
        Response.Redirect(sTarget)
    End Using
End Sub

在本地测试并使用直接 window 将测试 URL 注入 uCurrent 变量时,一切都适用于所有 URL 和词干组合。完全符合设计。

但是,当部署到 IIS 时,没有词干的 URLs [h t t p : / / ribbit.com] 可以工作,但有词干的东西:[h t t p : // meow.com/hiss-scratch.html] 或 [h t t p : // ribbit.com/backbeat.html?FBCLID=whatever] 因 404 而失败。301 重定向似乎在我的重定向器发出后被覆盖站点处理中。

我错过了什么?

答案基于以下事实:.html 扩展名通常不会路由到 global.asax。我能够使用旧的 Intellegencia URLRewriter 并让程序拦截 404 并将其发送到 Application_Error 事件。