2008-10-28 3 views
7

Я использую Response.Redirect для перенаправления пользователей на другой сервер для загрузки файла, а другой сервер проверяет заголовок, чтобы убедиться, что он пришел с правильного сервера ... однако кажется, что Response.Redirect разбивает заголовки на ответ.Response.Redirect Strips Header Referrer - Можно ли добавить его обратно?

Кто-нибудь знает, как я могу добавить заголовки назад? Я пробовал:

Response.AddHeader("Referer", "www.domain.com"); 

Но принимающая страница проверяет false, когда я проверяю, установлен ли заголовок Referrer.

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

ответ

1

Я не думаю, что это возможно. То, что вы отправляете обратно клиенту, - это заголовок Location, который сообщает клиенту, чтобы загрузить указанную страницу вместо запрашиваемой страницы. В этом случае клиент не приходит из ссылки и поэтому не устанавливает заголовок реферера. В основном, как будто пользователь набрал URL-адрес перенаправления в строке местоположения в своем браузере.

Возможно, вы сможете сохранить реферер в сеансе или закодировать его в URL как параметр запроса. Как и в случае с формой Forms с ReturnUrl.

1

Есть Server.Transfer опция?

Есть некоторые оговорки, хотя вам нужно будет изучить. E.G. Сохраняет исходный URL-адрес, авторизацию и т. Д. Подробнее в ссылке.

Сохранение исходного URL-адреса может быть выгодным в этом случае.

+1

Server.Transfer - это только вариант, когда он находится на том же сервере, правильно? В этом случае мне нужно перенаправить на другой сервер, поэтому, вероятно, не получится работать :( – Jeeby 2008-10-28 12:41:39

+0

Правильно - тот же сервер ... – 2008-10-28 12:43:29

+0

ahh ну, а не быть тогда. – Jeeby 2008-10-28 12:49:31

2

Заголовок получателя, полученный вашим вторым сервером, генерируется браузером, и вряд ли вы сможете изменить его каким-либо разумным способом.

Вы пытались добавить ссылку на URL-адрес и затем читать это на своем втором сервере?

Response.Redirect("url?Referer=" + Server.UrlEncode(Request.UrlReferrer)); 
0

Установить аутентификации печенье (с шпоночным хэша и истечения 5 минут), отправить ответ редирект, браузер посылает новый запрос на второй сервер (если это та же область) вместе с Идент coookie , второй сервер проверяет файл cookie, гарантирует, что только первый сервер мог его установить, и отправляет содержимое в браузер.

3

Это будет идти против заголовка Referer (так в оригинале) definition:

Referer [так] поле заголовка запроса позволяет клиенту указать, для пользы сервера, то адрес (URI) из ресурс, из которого Request-URI был получен (The "ссылающейся", хотя поле заголовка написано с ошибками.)

Если вы перенаправляете, это явно не так, чтобы добавить этот заголовок.

Если вам нужна эта информация, попробуйте использовать файл cookie или какую-либо переменную сеанса, или даже лучше переменную в URL-адресе, как вы уже сказали.

0

Если перенаправление относится к одному и тому же процессу, я бы использовал значение Session для хранения URI реферера, чтобы позволить второстепенной странице забрать его. Я использую это в своей системе для поддержки реферера между перенаправлением http-соединений на нашу систему https.

+0

Что делать, если пользователь делает два запроса одновременно? знаете, в большинстве случаев это невозможно, но кто знает ... – 2008-10-28 14:31:41

+0

Это хороший вопрос. Я подозреваю, что второй запрос перезапишет значение Session ["referrer"], которое я создал, однако мой код уже сохранил первый запрос в таблице БД, поэтому у меня все еще есть его для целей отчетности, но излишний в этом сценарии. – Lazarus 2008-11-06 14:54:07

9

Доступен HTML-хак.

<form action="http://url.goes.here" id="test" method="GET"></form> 
<script type="text/javascript"> 
    document.getElementById("test").submit(); 
</script> 

Если вам нужно вызвать, что из кода позади, что можно сделать тоже:

Response.Write(@"<form action='http://url.goes.here' id='test' method='GET'></form> 
        <script type='text/javascript'> 
        document.getElementById('test').submit(); 
        </script> "); 

Как Inkel мог бы указать, что это свободная интерпретация Referer [так] спецификации. Он будет делать то, что вы хотите.

-2

+1 комментарий к комментарию выше.

Хотя, если вы не заботитесь о спецификации и просто хотите это сделать, вы можете избежать использования Response.Redirect и вместо этого создавать заголовки ответов самостоятельно.

Response.StatusCode = 302; //temp redirect 
Response.Headers.Add("Location", "your/url/here"); 
Response.Headers.Add("Referer", "something.com"); 
Response.End(); 

Это не в моей голове, возможно, в заголовке ответа может потребоваться еще несколько вещей.

1

Вот версия предыдущей, которая работает для меня:

default.asp 

servername = Lcase(Request.ServerVariables("SERVER_NAME")) 
Response.Status = "301 Moved Permanently" 
Response.AddHeader "Location", "http://yoursite" 
Response.AddHeader "Referer", servername 
Response.End() 
0

Я не предлагаю размещать - большинство сайтов блокировать это. просто используйте javascript document.location = '<%:yourURL%>;';, который автоматически загрузит новую страницу. это хорошо работает для меня, потому что ответ перенаправления не включает referrer.

1

Я знаю, что это старый, но я просто наткнулся на него, пытаясь сделать подобное.

Я не хотел добавлять его в URL-адрес, так как он каким-то образом загрязнил URL-адрес тем, что мне там не хотелось. Кроме того, я не хотел, чтобы люди случайно подписывали этот URL. Поэтому я использовал Cookies для добавления моих данных;

string token = vwrApi.GetAuthenticationToken(userId); 
Response.Cookies.Add(new HttpCookie("VwrAuthorization", token)); 
Response.Redirect(returnUrl, true); 

Конечно, это зависит от вашей способности изменять, где целевой сервер ищет информацию, но это еще один вариант, по крайней мере.

-1

Вам необходимо будет выдать ответ статуса 307 и установить заголовок местоположения для адресата, к которому вы хотите перенаправить пользователя. Это сохранит исходный референт [sic] заголовок неповрежденным.

HttpContext.Current.Response.StatusCode = 307; 
HttpContext.Current.Response.AddHeader("Location", "http://stackoverflow.com"); 
HttpContext.Current.Response.End(); 
Смежные вопросы