2009-04-21 2 views
5

Я пытаюсь найти URL-адрес предыдущей страницы. Как если бы пользователь переходил с страницы A на страницу B, используя Server.Redirect("B.aspx"), страница B может отображать URL-адрес, ссылающийся на него.Поиск предыдущей страницы Url

Я попытался с помощью

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

Почему вы пытаетесь это сделать? Возможно, есть другое решение, более легкое для вашей проблемы. – eKek0

+2

В моем случае мне нужно было знать рефератора, когда страница ASPX загружала статический контент из CDN. Решение (в моем случае ваш пробег может отличаться) должен был вытащить значение из HttpRequest.Params.Get («HTTP_REFERER»). – jerhewet

+0

Last ToString отсутствует параны. Также ToString() не требуется для этого конкретного экземпляра. – DeadlyChambers

ответ

4

Если это только для этого сценария (где вы программно перенаправлять к B.aspx), то почему бы не поставить что-то на querystring, чтобы сказать, откуда произошла переадресация. Это, скорее всего, будет работать с несколькими типами браузеров и устройствами.

Одно из преимуществ этого подхода заключается в том, что вы сможете рассказать о разнице между перенаправлением на B.aspx и прямой ссылкой (либо по ссылке на одной из ваших страниц, либо от пользователя, вводящего URL-адрес в адресную базу) на страницу B.aspx.

Referrer - это то, что клиент предоставляет как часть HTTP-запроса. Таким образом, вы не можете полагаться на это.

Кстати, связан этот вопрос: Request.UrlReferrer null?

Update Учитывая ваши комментарии не ясно, что это простое решение, отличное от «редактировать все файлы». Я подозреваю, что глобальный поиск/замена может быть вашим лучшим выбором.

Дополнительные сведения: Если вы используете 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) 

Вот запрос HTTP, который генерируется при нажатии «Вопросы» ссылку на 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 

Вы можете видеть, что позднее, созданный ссылкой на странице, генерируется заголовок Referer.

+0

Мне жаль, но я не мог найти эту тему спасибо за ваш ответ, но думаю, мне придется отредактировать 50 000 страниц , поэтому я пытаюсь найти логику, чтобы поместить ее на свою страницу ошибок, чтобы я мог прийти к знаете, какая страница имеет сломанный URL – Searock

+1

В этом случае, я думаю, вам, вероятно, нужно защищать код на этой странице и понять, что вы не всегда получите эту информацию. Сожалею. –

2

Вы также можете использовать Server.Tansfer("B.aspx") вместо Response.Redirect("B.aspx")

Edit: Searock, если вы не хотите, чтобы изменить существующий код, Request.ServerVariables["HTTP_REFERER"].ToString() должен работать хорошо в этом случае.

2

Просто отметьте, что HTTP_REFERER не является надежным. Вы не можете полагаться на это, потому что так много клиентов не отправляют по различным причинам (параноидальные настройки, программное обеспечение для обеспечения безопасности и т. Д.).

Кроме того, некоторые новые окна, открытые JS, могут не иметь REFERER . SSL> НИКАКИЕ страницы SSL не будут иметь REFERER, поэтому будьте осторожны, полагаясь на что-то подобное.

Лучшая идея - отправить предыдущую страницу в Querystring.

Если это ASPX, вы можете сделать это более умным способом, как добавление нового скрытого параметра во все формы или ссылку на обработку непосредственно перед записью буфера.

4

Вы можете сохранять текущую страницу в сессии, а затем извлечь его оттуда:

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

Таким образом строка ПредыдущаяСтраница всегда будет содержать имя файла предыдущей страницы, и переменная сессии будет содержать текущую страницу, готов к использованию на следующей странице.

Таким образом, вы также можете определить, является ли ссылка референтом внешней ссылкой, потому что предыдущая строка будет равна NULL.

+2

Будет проблемой, если пользователь использует два окна, поэтому сеанс будет перезаписан. Если это не проблема, это хорошее решение. –

1

Не могли бы вы просто подтвердить, какие методы вы используете здесь (в идеале, редактируя исходный вопрос)?

HttpServerUtility (т. Е. ).) не имеет метода «Перенаправления», он имеет Передачу и Выполнение.

HttpResponse (т. Е. Ответ.).

HttpResponse.Redirect отправит 302 ответ клиенту, сообщая ему о выдаче нового запроса для значения поля «Место». Затем я могу запросить Request.UrlReferrer, чтобы увидеть значение страницы, которая выполняла перенаправление.

Если вы используете HttpServerUtility.Transfer или HttpServerUtility.Execute, то эти действия происходят исключительно на сервере в ASP.NET, и поэтому «referrer» может быть нулевым. Клиентский браузер также будет думать, что он все еще находится на первоначально запрошенной странице.

См. Также How to detect if an aspx page was called from Server.Execute

Смежные вопросы