【问题标题】:Routing Classic ASP Requests To .NET - SEO Redirects将经典 ASP 请求路由到 .NET - SEO 重定向
【发布时间】:2023-03-10 06:48:01
【问题描述】:

我们正在用 .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 引擎之前对其进行路由。

提前致谢

史蒂夫

【问题讨论】:

  • 您使用的是什么版本的 IIS?

标签: asp.net asp-classic routing seo


【解决方案1】:

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

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

【讨论】:

  • 我们也倾向于采用这条路线——尽管我们通常在 IIS 和 web.config 中将 404 处理程序设置为指向同一个 aspx 页面。然后该页面与映射数据库(旧/虚/等 url 到新 url)进行对话。
【解决方案2】:

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

您需要使用Context.Response.RedirectLocation 才能使状态码起作用。


我在 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 过滤器 这样:

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

【讨论】:

  • 感谢您的详细回复。应该尝试这样做 - 感谢所有回复的人!
  • context.reponse.redirect 不会否定 301(永久 301 与临时 302)吗?
  • @EdSF:不,你可以明确告诉重定向的状态码。
  • @EduardoMolteni response.redirect 是 302 temporary - 您确实设置了状态码,但随后的重定向将是 302 到客户端/浏览器。这个SO thread 讨论了这个和新的ASP.Net 4 redirect.permanent,并且还回答了在 ASP.net 4 之前所做的事情.....
  • @EdSF:你猜怎么着?我错了,你是对的。改变了答案。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    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 和 301,所以也许这不是问题。但在我看来,最好使用真正的永久重定向 (301)。

    对于那些使用 v4 框架的人来说,似乎有一个新选项:

    Response.RedirectPermanent("/something")
    

    我没有对此进行测试,但我假设它提供了 301 作为状态码。详情在这里:HttpResponse.RedirectPermanent

    【讨论】:

    • 刚刚通过@EdSF 请求查看了答案
    猜你喜欢
    • 2015-09-08
    • 1970-01-01
    • 2012-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多