将经典ASP请求路由到.NET - SEO重定向

时间:2009-10-23 16:59:36

标签: asp.net asp-classic routing seo

我们正在用.NET 3.5解决方案取代旧的经典asp网站。

我们需要将所有经典ASP请求重定向到aspx页面(即contactus.asp,现在可以路由到/contact-us/default.aspx)。我喜欢的是请求命中global.asax所以我可以做类似

的事情
If url == "bob.asp"
    Response.Status = "301 Moved Permanently";
    Response.AddHeader("Location", SiteConfig.SiteURL + redirectUrl);
End If

有两个不优雅的解决方案。

A)放置一个global.asa文件并通过它进行路由。

B)将asp文件映射到.NET引擎。很好,但是如果我们需要在我们的网站上托管经典的asp网站,IIS会将请求发送到错误的地方。

我在这里找到了一个很好的解决方案

http://forums.asp.net/p/1202225/3458901.aspx

哪个说明这样的话可能有用......

<buildProviders>

<add extension=".php" type="System.Web.Compilation.PageBuildProvider" />

</buildProviders>
<httpHandlers>

<add verb="*" path="*.php" type="System.Web.UI.PageHandlerFactory" validate="True" />

</httpHandlers>

这个例子是针对php的,但我认为同样的事情适用于asp。但是,在示例中将.php更改为.asp并将标记放在web.config的正确部分后,我没有任何喜悦(实际上是500服务器错误)。

任何人都可以对此有所了解或给我一个优雅的解决方案。

有一种感觉上面的解决方案不能用于php或asp,因为IIS会在它到达.NET引擎之前路由请求。

提前致谢

史蒂夫

4 个答案:

答案 0 :(得分:4)

大编辑: @EdSF在评论中指出答案是错误的。难以置信,我使用Firebug进行了检查,事实上,这是错误的

您需要使用Context.Response.RedirectLocation才能使状态代码生效。

enter image description here


我在global.asax中做了同样的事情:

Sub Application_BeginRequest(ByVal sender As Object, ByVal e As System.EventArgs)
    Dim fullOriginalpath As String = Request.Url.ToString.ToLower

    If (fullOriginalpath.Contains("/verarticulo.asp?articuloid=")) Then
        Context.Response.StatusCode = 301
        ''// this does not work, returns a 302
        ''//Context.Response.Redirect("/noticias/" + getIDFromPath(fullOriginalpath))

        ''// this does right way
        Context.Response.RedirectLocation = "/noticias/" + getIDFromPath(fullOriginalpath)
        Context.Response.End()
    ElseIf (fullOriginalpath.Contains("/archivo.asp")) Then
        Context.Response.StatusCode = 301
        Context.Response.RedirectLocation = "/archivo/" 
        Context.Response.End()
    ElseIf (fullOriginalpath.EndsWith("/default.asp")) Then
        Context.Response.StatusCode = 301
        Context.Response.RedirectLocation = "/"
        Context.Response.End()
    End If
End Sub

如果您使用的是II6,则必须执行此操作,您必须配置此ISAPI筛选器 这样:

enter image description here

该文件为c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll

答案 1 :(得分:1)

最简单的方法是在IIS级别使用自定义404错误页面。此页面可以是任何ASPX页面;您可以通过HttpContext访问原始请求。

在IIS 6.0中,您会注意到默认情况下,映射到.NET引擎的URL(.aspx,asmx等)使用web.config中定义的自己的404处理程序。不管;如果编辑ASPX引擎映射并确保设置“文件必须存在”的复选框,则甚至可以将这些页面发送到IIS 404页面。这会将所有boken链接重定向到IIS 404处理程序,即使它们映射到.NET处理程序也是如此。人们犯了错误,试图将所有损坏的链接重定向到web.config定义404handler;如果你强迫所有人去IIS定义的一个instread,那就更容易了。

答案 2 :(得分:1)

除了一件事,Eduardo Molteni的回答是有效的。它实际上将浏览器传递给302而不是301。

我相信而不是:

Context.Response.StatusCode = 301 
Context.Response.Redirect("/something/") 

它应该是:

Context.Response.StatusCode = 301 
Context.Response.RedirectLocation = "/something") 

response.redirect基本上会中断你使用Response.StatusCode设置的内容,浏览器最终得到“302 Found”。

我不确定搜索引擎如何处理302 vs 301,所以可能不是问题。在我看来,真正的永久重定向(301)将是首选。

对于框架v4的那些人,似乎有一个新的选择:

Response.RedirectPermanent("/something")

我没有对此进行过测试,但我假设它提供了301作为状态代码。详情请见HttpResponse.RedirectPermanent

答案 3 :(得分:0)

我使用http://evolvedcode.net/content/code_smart404/的Smart 404处理程序脚本的修改版本。我添加了代码来根据数据库中的表进行自定义映射。

这个脚本可以很容易地在ASP.NET中重写,然后以相同的方式映射。