Asp.net 查找上一页Url

Asp.net 查找上一页Url,asp.net,Asp.net,我正在尝试查找上一页的url。例如,如果用户使用Server.Redirect(“B.aspx”)从a页导航到B页,B页可以显示引用它的url 我试过使用 Response.Write(Page.PreviousPage.ToString()); Response.Write(Request.UrlReferrer.ToString()); Response.Write(Context.Request.UrlReferrer.ToString()); Response.Write(Requ

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

我试过使用

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

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

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

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

但是它给了我一个无效的
空异常
错误

如果它只是针对这个场景(您通过编程重定向到B.aspx),那么为什么不在查询字符串上添加一些内容来说明重定向的来源呢。这更有可能适用于多浏览器类型和设备

这种方法的一个优点是,您能够区分重定向到B.aspx和直接链接到B.aspx页面之间的区别(通过一个页面上的链接,或者从用户将URL输入地址库)

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

顺便说一下,这个问题是相关的:

更新 根据你的评论,除了“编辑所有文件”之外,这不是一个简单的解决方案。我怀疑全局搜索/替换可能是您的最佳选择

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

以下是通过单击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头

您也可以使用
Server.Tansfer(“B.aspx”)
而不是
Response.Redirect(“B.aspx”)


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

请注意HTTP\u REFERER不可靠。你不能依赖它,因为很多客户端由于各种原因(偏执设置、安全软件等)而不发送

另外,JS打开的一些新窗口可能没有REFERER SSL>NONE-SSL页面也不会有REFERER,所以要小心依赖类似的东西

更好的办法是发送Querystring中的上一页


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

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

string previousPage = Session["PreviousPage"] as string;
Session["PreviousPage"] = System.IO.Path.GetFileName(System.Web.HttpContext.Current.Request.FilePath);
这样,previousPage字符串将始终包含上一页的文件名,会话变量将包含当前页,准备在下一页上使用


通过这种方式,您还可以检测推荐人是否是外部链接,因为之前的页面字符串将为空。

您能否确认您在此处实际使用的方法(最好是编辑原始问题)

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

(即响应)没有

将向客户端发送302响应,告诉它发出新的位置字段值请求。然后,我可以查询Request.urlReferer以查看执行重定向的页面的值

如果您正在使用或,那么这些操作完全发生在ASP.NET中的服务器上,因此“referer”很可能为空。客户端浏览器也会认为它仍然在最初请求的页面上


另请参见

为什么要这样做?也许还有其他更容易解决您的问题的解决方案在我的例子中,我需要知道当一个ASPX页面从CDN加载静态内容时的参考者。解决方案(在我的例子中,您的里程数可能会有所不同)是从HttpRequest.Params.Get(“HTTP_REFERER”)中提取值。最后一个ToString缺少parans。还有ToString()此特定实例不需要。很抱歉,我找不到此线程。谢谢您的回答,但我想我必须编辑50000页,因此我正在尝试找到逻辑,将其放在自定义错误页上,以便我可以知道哪一页的URL已损坏。在这种情况下,我认为您可能需要对此进行防御编码翻页并意识到你不会总是得到这些信息。抱歉。如果用户使用两个窗口,则会话将被覆盖,这将是一个问题。如果这不是一个问题,这是一个很好的解决方案。
string previousPage = Session["PreviousPage"] as string;
Session["PreviousPage"] = System.IO.Path.GetFileName(System.Web.HttpContext.Current.Request.FilePath);