I am using UrlRewriter that is registered as http module in web.config, I have some 301 redirects in place that does works when i request the page through web browser however when request comes from google robots then it return 404 error.
Does it means httpmodules doesn't get activated when request comes through crawlers? How do i make sure that my 301 redirect does get forced even when request comes from a crawler?
Imports System.Web
Imports System.IO
Public Class UrlRewriter Implements System.Web.IHttpModule
Public Sub Init(ByVal app As System.Web.HttpApplication) Implements System.Web.IHttpModule.Init
AddHandler app.AuthorizeRequest, AddressOf AuthorizeRequest
End Sub
Public Sub Dispose() Implements System.Web.IHttpModule.Dispose
End Sub
Protected Sub AuthorizeRequest(ByVal sender As Object, ByVal e As EventArgs)
Dim app As HttpApplication = CType(sender, HttpApplication)
Dim host As Eteach.Entity.Host = Eteach.UI.Web.Host.Current(app.Context)
Dim rewriteUrl As String = app.Context.Request.Path
Dim reqPath As String = app.Context.Request.Path.ToLower
Dim reqUrl As String = reqPath
If app.Context.Request.QueryString.Count > 0 Then
rewriteUrl &= "?" & app.Context.Request.QueryString.ToString
reqUrl &= "?" & app.Context.Request.QueryString.ToString.ToLower
End If
If Not host Is Nothing AndAlso host.UrlRewrites.ContainsKey(reqUrl) Then
Dim url As String = host.UrlRewrites(reqUrl)
Dim qs As String = String.Empty
If url.Contains("?") Then
qs = url.Substring(url.IndexOf("?") + 1)
url = url.Substring(0, url.IndexOf("?"))
End If
app.Context.Items("Page_RewriteUrl") = rewriteUrl
app.Context.RewritePath(url, String.Empty, qs)
ElseIf Not host Is Nothing AndAlso host.UrlRedirect301s.ContainsKey(reqUrl) Then
app.Context.Response.Clear()
app.Context.Response.StatusCode = 301
app.Context.Response.Status = "301 Moved Permanently"
app.Context.Response.AddHeader("Location", host.UrlRedirect301s(reqUrl))
app.Context.Response.End()
ElseIf Not host Is Nothing AndAlso host.UrlRedirects.ContainsKey(reqUrl) Then
app.Context.Response.Clear()
app.Context.Response.Redirect(host.UrlRedirects(reqUrl))
app.Context.Response.End()
ElseIf reqPath.EndsWith("/") AndAlso File.Exists(app.Context.Server.MapPath(reqPath & "default.aspx")) Then
app.Context.Items("Page_RewriteUrl") = rewriteUrl
If app.Context.Request.QueryString.Count > 0 Then
app.Context.RewritePath(reqPath & "default.aspx", String.Empty, app.Context.Request.QueryString.ToString)
Else
app.Context.RewritePath(reqPath & "default.aspx", String.Empty, String.Empty)
End If
ElseIf reqPath.EndsWith("/default.aspx") Then
Dim url As String = app.Context.Request.Path
url = url.Substring(0, url.Length - 12)
If app.Context.Request.QueryString.Count > 0 Then
url &= "?" & app.Context.Request.QueryString.ToString
End If
app.Context.Response.Clear()
app.Context.Response.StatusCode = 301
app.Context.Response.Status = "301 Moved Permanently"
app.Context.Response.AddHeader("Location", url)
app.Context.Response.End()
ElseIf reqPath.StartsWith("/cms/" & host.ID.ToString & "/") Then
Dim url As String = app.Context.Request.Path
url = url.Remove(0, 6 + host.ID.ToString.Length)
url = url.Insert(0, "/DataFiles/CMS/" & host.ID.ToString & "/pages/")
app.Context.Items("Page_RewriteUrl") = rewriteUrl
If app.Context.Request.QueryString.Count > 0 Then
app.Context.RewritePath(url, String.Empty, app.Context.Request.QueryString.ToString)
Else
app.Context.RewritePath(url, String.Empty, String.Empty)
End If
End If
End Sub
End Class