Response.Redirect удаляет реферер заголовка - можно добавить его обратно? - PullRequest
7 голосов
/ 28 октября 2008

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

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

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

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

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

Ответы [ 12 ]

9 голосов
/ 29 октября 2008

Доступен взлом на 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> ");

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

3 голосов
/ 28 октября 2008

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

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

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

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

2 голосов
/ 28 октября 2008

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

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

Response.Redirect("url?Referer=" + Server.UrlEncode(Request.UrlReferrer));
1 голос
/ 13 апреля 2012

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

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

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

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

1 голос
/ 16 декабря 2010

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

default.asp

servername = Lcase(Request.ServerVariables("SERVER_NAME"))
Response.Status = "301 Moved Permanently"
Response.AddHeader "Location", "http://yoursite"
Response.AddHeader "Referer", servername
Response.End()
1 голос
/ 28 октября 2008

Является ли Server.Transfer опцией?

Есть некоторые предостережения, которые вам необходимо изучить. НАПРИМЕР. Сохраняет оригинальный URL, авторизацию и т. Д. Подробнее в ссылке.

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

1 голос
/ 28 октября 2008

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

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

0 голосов
/ 27 июня 2012

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

HttpContext.Current.Response.StatusCode = 307;
HttpContext.Current.Response.AddHeader("Location", "http://stackoverflow.com");
HttpContext.Current.Response.End(); 
0 голосов
/ 06 марта 2012

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

0 голосов
/ 29 октября 2008

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

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

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

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

...