【问题标题】:404 page that displays requested page显示请求页面的 404 页面
【发布时间】:2008-09-29 19:45:40
【问题描述】:

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

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

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

但这没有用。

有什么想法吗?

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

【问题讨论】:

  • @GThompson83 - 查看我的答案的更新。

标签: c# asp.net vb.net asp-classic umbraco


【解决方案1】:

我在自定义 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();
    }

【讨论】:

    【解决方案2】:

    怎么样:

    Request.ServerVariables("HTTP_REFERER");
    

    【讨论】:

    • 抱歉打错了。我正在使用 ServerVariables
    【解决方案3】:

    很多链接都变了,但是可以通过在url中搜索patterns来轻松更正

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

    微软已经发布了URL Rewrite Module for IIS 7,并且有一个不错的介绍herehere

    对于 IIS 6,有一个 good intro here 可以使用它进行 URL 重写,与 IIS7 略有不同。

    一个示例重写规则是

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

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 我意识到这是一种黑客攻击,但客户已经启动了该网站,我们正在寻找一种快速解决这种情况的方法。他们不想让某人在第二天左右创建数百个重定向。
      • 您不必手动制作,只需使用 URL 重写即可。
      【解决方案5】:

      这是我们在 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 重写将是可行的方法。

      【讨论】:

        【解决方案6】:

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

        \config\UrlRewriting.config
        

        希望对你有帮助

        【讨论】:

          【解决方案7】:

          更新,你居然想接:

          VB.NET:

          Request.QueryString("aspxerrorpath")
          

          C#:

          Request.QueryString["aspxerrorpath"];
          

          【讨论】:

          • 应该用方括号代替大括号:Request.QueryString["aspxerrorpath")
          • 谢谢!接受的答案使用 C# 并且问题的第一个标签也是 C#,这解释了我的困惑,但我坚持纠正并希望我的评论可能对其他 C# 开发人员有所帮助。
          猜你喜欢
          • 2015-06-10
          • 2019-03-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-08
          • 2015-08-15
          • 2015-11-15
          • 2018-05-28
          相关资源
          最近更新 更多