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
事件。
.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
事件。