我最近将网站迁移到新的CMS(Umbraco)。许多链接已经改变,但是通过在URL中搜索模式可以很容易地纠正它们,所以如果找不到旧的链接,我想写一些会重定向到正确页面的内容。那部分不是问题。

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

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

但那没用。

任何想法?

该网站位于IIS 6.0上。 我们确实考虑过使用301重定向,但是我们没有办法知道人们有哪些页面加入书签,而且有几百页,所以没有人热衷于花时间来创建301。

有帮助吗?

解决方案

我在自定义404错误处理页面中提出的基本相同。在IIS 6上,原始URL位于查询字符串中。下面的代码显示了如何获取原始URL然后转发用户。在我的情况下,我从旧的ASP切换到新的ASP.NET,因此所有.asp页面都必须转发到.aspx页面。此外,一些网址已更改,因此我在旧网址中查找关键字并转发。

//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();
    }

其他提示

怎么样:

Request.ServerVariables("HTTP_REFERER");
  

许多链接已更改,但可以通过在网址中搜索模式轻松更正这些链接

您是否考虑过使用网址重写,而不是将您的用户发送到404?通过这种方式,您的用户(以及搜索引擎,如果这对您来说很重要)将获得 301或302 而不是必须通过你的404处理程序。服务器上处理重写的速度通常更快,压力更小,而不是启动代码并在那里处理代码。

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的

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

我认为正确的做法是使用 301重定向,而不是使用404页面。 - 永久移动代码。

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

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

CheckforRedirects具有自定义逻辑,以便将旧网址与新网址相匹配。

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

如果有一个一致的模式可用于将旧URL映射到带有正则表达式的新URL,那么URL重写将是最佳选择。

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

\config\UrlRewriting.config

希望这有帮助

更新,您确实想要接听:

VB.NET:

Request.QueryString("aspxerrorpath")

C#:

Request.QueryString["aspxerrorpath"];
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top