我最近将网站迁移到新的CMS(Umbraco)。许多链接已经改变,但是通过在URL中搜索模式可以很容易地纠正它们,所以如果找不到旧的链接,我想写一些会重定向到正确页面的内容。那部分不是问题。
将浏览器重定向到自定义404页面后,如何获取请求的URL。我尝试使用:
request.ServerVariables("HTTP_REFERER") 'sorry i corrected the typo from system to server.
但那没用。
任何想法?
该网站位于IIS 6.0上。 我们确实考虑过使用301重定向,但是我们没有办法知道人们有哪些页面加入书签,而且有几百页,所以没有人热衷于花时间来创建301。
答案 0 :(得分:3)
我在自定义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();
}
答案 1 :(得分:2)
怎么样:
Request.ServerVariables("HTTP_REFERER");
答案 2 :(得分:2)
许多链接已更改,但可以通过在网址中搜索模式轻松更正这些链接
您是否考虑过使用网址重写,而不是将您的用户发送到404?这样,您的用户(以及搜索引擎,如果在这种情况下对您来说很重要)将获得301 or 302,而不必通过您的404处理程序。服务器上处理重写的速度通常更快,压力更小,而不是启动代码并在那里处理代码。
微软发布了一个URL Rewrite Module for IIS 7,其中有一个很好的介绍here和here。
对于IIS 6,使用它进行URL重写需要good intro here,与IIS7略有不同。
示例重写规则是
# $1 will contain the contents of (.*) - everything after new-dir/
RewriteRule /new-dir/(.*) /find_old_page.asp?code=$1
有几百页,所以没有人热衷于花时间来创建301的
重写规则的优点在于您无需列出以明确列出所有页面,但可以编写遵循相同模式的规则。我们最近不得不做类似的事情,令人惊讶的是,有多少移动的网址可以通过几个简单的规则来处理。
答案 3 :(得分:1)
我认为正确的做法是使用301 - Moved Permanently代码重定向,而不是使用404页面。
答案 4 :(得分: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具有自定义逻辑,以便将旧网址与新网址相匹配。
我认为这是首选方法(与301s或URL重写相反),如果你在内部有足够的信息来匹配来自旧系统的大量URL与新系统 - 例如如果你有一个表与旧ID匹配新ID或类似的东西。
如果有一个一致的模式可用于将旧URL映射到带有正则表达式的新URL,那么URL重写就是最佳选择。
答案 5 :(得分:1)
为了构建重写建议,Umbraco已经使用了UrlRewriting.NET并且可以添加新的重写
\config\UrlRewriting.config
希望这有帮助
答案 6 :(得分:0)
更新,您确实想要接听:
VB.NET:
Request.QueryString("aspxerrorpath")
C#:
Request.QueryString["aspxerrorpath"];