查找上一页网址

时间:2009-04-21 14:11:55

标签: asp.net

我正在尝试查找上一页的网址。例如,如果用户使用Server.Redirect("B.aspx")从网页A导航到网页B,则网页B可以显示引用它的网址。

我尝试过使用

Response.Write(Page.PreviousPage.ToString());

Response.Write(Request.UrlReferrer.ToString());

Response.Write(Context.Request.UrlReferrer.ToString());

Response.Write(Request.ServerVariables["HTTP_REFERER"].ToString);

但是一切都是徒劳的,它给了我null exception错误

5 个答案:

答案 0 :(得分:5)

您可以在会话中保存当前页面,然后从那里检索它:

string previousPage = Session["PreviousPage"] as string;
Session["PreviousPage"] = System.IO.Path.GetFileName(System.Web.HttpContext.Current.Request.FilePath);

这样,previousPage字符串将始终包含上一页的文件名,Session变量将包含当前页面,可以在下一页上使用。

这样你也可以检测引用者是否是外部链接,因为previousPage字符串将为null。

答案 1 :(得分:4)

如果只是针对这种情况(以编程方式重定向到B.aspx),那么为什么不在查询字符串上添加一些内容来说明重定向的来源。这可能更适用于多种浏览器类型和设备。

这种方法的一个优点是,您可以区分重定向到B.aspx和直接链接(通过其中一个页面上的链接,或者从输入URL的用户到地址库)到页面B.aspx。

引用者是客户端作为HTTP请求的一部分提供的东西。因此,你不能依赖它。

顺便说一下,这个问题是相关的: Request.UrlReferrer null?

<强>更新 鉴于您的意见,除了“编辑所有文件”之外,还不清楚这是一个简单的解决方案。我怀疑全球搜索/替换可能是你最好的选择。

更多背景信息:如果您使用Fiddler(或任何其他http调试工具),您应该能够看到在执行重定向时没有填充Referrer标头。例如,这是重定向的结果(即HTTP 302响应导致IE重定向到另一个页面):

GET /webapplication1/WebForm3.aspx HTTP/1.1
Accept: image/gif, image/jpeg, image/pjpeg, application/x-ms-application, application/vnd.ms-xpsdocument, application/xaml+xml, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, */*
Accept-Language: en-GB
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; WOW64; Trident/4.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; InfoPath.2; .NET CLR 3.5.21022; .NET CLR 3.5.30729; .NET CLR 3.0.30618; MS-RTC LM 8; Zune 3.0)
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
Host: (removed)

以下是通过单击StackOverflow.com上的“问题”链接生成的HTTP请求:

GET /questions HTTP/1.1
    Accept: image/gif, image/jpeg, image/pjpeg, application/x-ms-application, application/vnd.ms-xpsdocument, application/xaml+xml, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, */*
    Referer: https://stackoverflow.com/questions/772780/finding-previous-page-url
    Accept-Language: en-GB
    User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; WOW64; Trident/4.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; InfoPath.2; .NET CLR 3.5.21022; .NET CLR 3.5.30729; .NET CLR 3.0.30618; MS-RTC LM 8; Zune 3.0)
    Accept-Encoding: gzip, deflate
    Host: stackoverflow.com
    Connection: Keep-Alive

您可以看到由页面上的链接生成的后者生成Referer标头。

答案 2 :(得分:2)

您也可以使用Server.Tansfer("B.aspx")代替Response.Redirect("B.aspx")

编辑:Searock,如果您不想更改现有代码,Request.ServerVariables["HTTP_REFERER"].ToString()在这种情况下应该可以正常工作。

答案 3 :(得分:2)

请注意 HTTP_REFERER不可靠。你不能依赖它,因为有很多客户因各种原因(偏执设置,安全软件等)不发送。

JS打开的一些新窗口可能没有REFERER SSL&gt;没有SSL页面也没有REFERER,所以要小心依赖这样的东西。

更好的想法是在Querystring中发送上一页。

如果它是ASPX,你可以用更聪明的方式来做,比如在写出缓冲区之前向所有表单或处理链接添加新的隐藏参数。

答案 4 :(得分:1)

您能否确认一下您实际使用的方法(最好通过编辑原始问题)?

HttpServerUtility(即服务器。)没有“重定向”方法,它有传输和执行。

HttpResponse(即响应。)确实如此。

HttpResponse.Redirect将向客户端发送302响应,告知其发出对“位置”字段值的新请求。然后,我可以查询Request.UrlReferrer以查看执行重定向的页面的值。

如果您使用HttpServerUtility.TransferHttpServerUtility.Execute,则这些操作完全在ASP.NET内的服务器上发生,因此“referrer”可能为null。客户端浏览器也会认为它仍在最初请求的页面上。

另见How to detect if an aspx page was called from Server.Execute