1

我最近将一个网站迁移到一个新的 CMS (Umbraco)。很多链接都发生了变化,但是可以通过在 url 中搜索模式来轻松纠正它们,所以我想写一些东西,如果找不到旧的页面会重定向到正确的页面。那部分没有问题。

浏览器重定向到我的自定义 404 页面后,如何获取请求的 URL。我尝试使用:

request.ServerVariables("HTTP_REFERER") 'sorry i corrected the typo from system to server.

但这没有用。

有任何想法吗?

该站点位于 IIS 6.0 上。我们确实考虑过使用 301 重定向,但我们无法知道人们收藏了哪些页面并且有几百页,因此没有人热衷于花时间创建 301。

4

7 回答 7

3

我在自定义 404 错误处理页面中所做的基本上与您要求的相同。在 IIS 6 上,原始 URL 位于查询字符串中。下面的代码展示了如何获取原始 URL,然后转发用户。在我的例子中,我从旧的 ASP 切换到新的 ASP.NET,所以所有的 .asp 页面都必须转发到 .aspx 页面。此外,一些 URL 发生了变化,所以我在旧 URL 中查找关键字并转发。

//did the error go to a .ASP page?  If so, append x (for .aspx) and 
//issue a 301 permanently moved
//when we get an error, the querystring will be "404;<complete original URL>"
string targetPage = Request.RawUrl.Substring(Request.FilePath.Length);

if((null == targetPage) || (targetPage.Length == 0))
    targetPage = "[home page]";
else
{
     //find the original URL
    if(targetPage[0] == '?')
    {
        if(-1 != targetPage.IndexOf("?aspxerrorpath="))
             targetPage = targetPage.Substring(15); // ?aspxerrorpath=
        else
             targetPage = targetPage.Substring(5); // ?404;
        }
        else
        {
             if(-1 != targetPage.IndexOf("errorpath="))
             targetPage = targetPage.Substring(14); // aspxerrorpath=
             else
            targetPage = targetPage.Substring(4); // 404;
        }
    }               

    string upperTarget = targetPage.ToUpper();
    if((-1 == upperTarget.IndexOf(".ASPX")) && (-1 != upperTarget.IndexOf(".ASP")))
    {
        //this is a request for an .ASP page - permanently redirect to .aspx
        targetPage = upperTarget.Replace(".ASP", ".ASPX");
        //issue 301 redirect
        Response.Status = "301 Moved Permanently"; 
        Response.AddHeader("Location",targetPage);
        Response.End();
    }

    if(-1 != upperTarget.IndexOf("ORDER"))
    {
                //going to old order page -- forward to new page
               Response.Redirect(WebRoot + "/order.aspx");
           Response.End();
    }
于 2008-09-29T20:18:18.340 回答
2

怎么样:

Request.ServerVariables("HTTP_REFERER");
于 2008-09-29T19:48:40.253 回答
2

很多链接都发生了变化,但可以通过在 url 中搜索模式轻松纠正它们

您是否考虑过使用 url 重写,而不是将您的用户发送到 404?这样,您的用户(和搜索引擎,如果在这种情况下这对您很重要)将获得301 或 302,而不必通过您的 404 处理程序。在你的服务器上处理 url 级别的重写通常比启动你的代码并在那里处理它更快,压力更小。

Microsoft 发布了一个用于 IIS 7 的 URL 重写模块,这里这里都有一个不错的介绍。

对于 IIS 6,这里有一个很好的介绍来使用它进行 URL 重写,与 IIS7 略有不同。

一个示例重写规则是

# $1 will contain the contents of (.*) - everything after new-dir/
RewriteRule /new-dir/(.*) /find_old_page.asp?code=$1 

有几百页,所以没有人热衷于花时间创建 301

重写规则的美妙之处在于您不需要列出来明确列出所有页面,但可以编写遵循相同模式的规则。最近我们不得不做类似的事情,令人惊讶的是,有多少移动的 url 可以通过几个简单的规则来处理。

于 2008-09-29T19:51:04.210 回答
1

而不是使用 404 页面,我认为正确的做法是使用301 - Moved Permanently代码进行重定向。

于 2008-09-29T19:53:32.020 回答
1

以下是我们在 404 页面上对 init 所做的操作:

Dim AttemptedUrl As String = Request.QueryString("aspxerrorpath")
If Len(AttemptedUrl) = 0 Then AttemptedUrl = Request.Url.Query
AttemptedUrl = LCase(AttemptedUrl)
CheckForRedirects(AttemptedUrl)

CheckforRedirects 然后具有自定义逻辑以将旧 URL 与新 URL 匹配。

我认为这是首选方法(与 301 或 URL 重写相反),如果您在内部有足够的信息来匹配来自旧系统的大量 URL 与新系统 - 例如,如果您有一个匹配的表用新 ID 或类似的东西更新旧 ID。

但是,如果有一个一致的模式可用于使用正则表达式将旧 URL 映射到新 URL,那么 URL 重写将是可行的方法。

于 2008-09-29T20:34:40.253 回答
1

为了构建 Rewrites 建议,Umbraco 已经使用 UrlRewriting.NET 并且可以将新的重写添加到

\config\UrlRewriting.config

希望这可以帮助

于 2008-10-27T13:28:56.510 回答
0

更新,你实际上想拿起:

VB.NET:

Request.QueryString("aspxerrorpath")

C#:

Request.QueryString["aspxerrorpath"];
于 2008-09-29T19:48:32.173 回答