URL Rewrite сохраняет исходное расположение хоста при перенаправлении обратного прокси-сервера 301.

У меня есть настройка перезаписи URL на сайте IIS 7.5: http://site1.com/

Это действует как обратный прокси для второго сайта: http://site2.com/

Вот поток событий:
1. Браузер делает GET на http://site1.com/somepath
2. Это передается на site2, потому что site1 является обратным прокси-сервером перезаписи URL. Это работает хорошо, и хост настроен правильно, потому что я сделал мод, который требует этого.
3. site2 отвечает статусом 301 и устанавливает заголовок HTTP Location на http://site3.com/somenewpath
4. site1 отвечает браузеру 301, но заменяет хост в заголовке Location на site1: http://site1.com/somenewpath

На шаге 4 я хочу, чтобы site1 отвечал с помощью http://site3.com/somenewpath в заголовке HTTP Location и выполнял прямой просмотр этих данных. Я чувствую, что должно быть правило Outbound, которое может быть применено для решения этой проблемы, но пока не смогу его выяснить.

4 ответа

Решение

Может ли быть задействована маршрутизация запроса приложений? Посмотрите на IIS -> Компьютер или сайт -> Кэш маршрутизации запросов приложений -> Настройки прокси-сервера и снимите флажок "Обратный перезаписать хост в заголовках ответа". Если вы сделаете это на уровне машины, это вступит в силу для всех сайтов. Если вы сделаете это на определенном сайте, он вступит в силу только для этого сайта, и другие сайты на коробке не будут затронуты.

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

Если специальное правило для исходящих запросов действительно необходимо, этот код изменит заголовок HTTP-местоположения всех ответов 301 на http://site3.com/somepath

<outboundRules>
  <!-- This rule changes the domain in the HTTP location header for redirect responses -->
  <rule name="Change Location Header">
    <match serverVariable="RESPONSE_LOCATION" pattern="^http://[^/]+/(.*)" />
    <conditions>
      <add input="{RESPONSE_STATUS}" pattern="^301" />
    </conditions>
    <action type="Rewrite" value="http://www.site3.com/{R:1}" />
  </rule>
</outboundRules>

Это правило является небольшим изменением того, которое опубликовано в справочнике по конфигурации модуля перезаписи URL 2.0.

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

Просто сохраните redirect_url в<head>html-документа:

      <head>
  <meta http-equiv="Refresh" content="0; URL=https://example.com/">
</head>

Принятый ответ привел меня в правильном направлении, но мне пришлось еще немного покопаться в более новых версиях IIS, в которых нет Server Proxy Settingsупомянутое выше.

Отдайте должное этим URL-адресам:

IIS AAR - URL Rewrite для обратного прокси-сервера - как отправить HTTP_HOST

Запретить ARR с помощью UrlRewrite перезаписывать заголовок Location для перенаправления 302

На веб-сервере откройте Редактор конфигурации и перейдите по пути system.WebServer -> proxy. Изменить reverseRewriteHostInResponseHeadersк False. Это остановит Locationзаголовок в заголовках ответа от перезаписи.

Ответы, на которые я ссылался, относятся к preserveHostHeaderнастройка, которая не устранила проблему в моем случае. (Мой ответ от сервера был 302 с новым URL-адресом в заголовке местоположения)

Другие вопросы по тегам