我正在尝试查找上一页的网址。例如,如果用户使用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
错误
答案 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.Transfer或HttpServerUtility.Execute,则这些操作完全在ASP.NET内的服务器上发生,因此“referrer”可能为null。客户端浏览器也会认为它仍在最初请求的页面上。
另见How to detect if an aspx page was called from Server.Execute