Searock
Searock

Reputation: 6468

Finding previous page Url

i am trying to find the url of previous page.Such as if a user navigates from Page A to Page B using Server.Redirect("B.aspx"), page B can display the url referring to it.

I have tried using

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

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

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

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

but all in vain it gives me null exception error

Upvotes: 5

Views: 28134

Answers (5)

Zhaph - Ben Duguid
Zhaph - Ben Duguid

Reputation: 26956

Could you just confirm what methods you are actually using here (ideally by editing the original question)?

HttpServerUtility (i.e. Server.) doesn't have a "Redirect" method, it has Transfer and Execute.

HttpResponse (i.e. Response.) does.

HttpResponse.Redirect will send a 302 response to the client, telling it to issue a new request for the value of the Location field. I'm then able to query Request.UrlReferrer to see the value of the page that performed the Redirect.

If you are using HttpServerUtility.Transfer or HttpServerUtility.Execute then these actions happen entirely at the server within ASP.NET, and so the "referrer" may well be null. The client browser will also think it is still on the originally requested page.

See also How to detect if an aspx page was called from Server.Execute

Upvotes: 1

Cros
Cros

Reputation: 4377

You can save you current page in the Session and then retrieve it from there:

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

This way the previousPage string will always contain the previous page's filename, and the Session variable will contain the current page, ready to be used on the next page.

This way you can also detect if the referrer is an outside link because then the previousPage string will be null.

Upvotes: 5

Martin Peck
Martin Peck

Reputation: 11544

If it's only for this scenario (where you programatically redirect to B.aspx) then why not put something on the querystring to say where the redirect came from. This would be more likely to work across muliple browser types and devices.

One advantage to this approach is that you'll be able to tell the difference between a redirect to B.aspx and a direct link (either via a link on one of your pages, or from the user entering the URL into the address base) to page B.aspx.

The referrer is something the the client provides as part of the HTTP request. As such, you can't rely on it.

By the way, this question is related: Request.UrlReferrer null?

Update Given your comments it's not clear that's an easy solution other than "edit all your files". I suspect that global search/replace might be your best bet.

Some more background: If you use Fiddler (or any other http debugging tool) you should be able to see that the Referrer header isn't being populated when you perform a redirect. For example, this is the result of a redirect (i.e. an HTTP 302 response causing IE to redirect to another page):

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)

Here is the HTTP request that is generated by clicking the "Questions" link on StackOverflow.com:

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

You can see that the later, generated by a link on a page, generates the Referer header.

Upvotes: 4

dr. evil
dr. evil

Reputation: 27265

Just to note that HTTP_REFERER is not reliable. You can't rely on that because so many clients doesn't send for various reasons (paranoid settings, security software etc.).

Also some new windows opened by JS might not have REFERER SSL > NONE SSL pages won't have REFERER either, so be careful about relying something like that.

Better idea would be sending previous page in Querystring.

If it's ASPX you might do it in more clever way like adding a new hidden parameter to all forms or processing link just before writing out the buffer.

Upvotes: 2

awaisj
awaisj

Reputation: 344

You can also use Server.Tansfer("B.aspx") instead of Response.Redirect("B.aspx")

Edit: Searock, if you don't want to change your existing code, Request.ServerVariables["HTTP_REFERER"].ToString() should work fine in that case.

Upvotes: 2

Related Questions