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-адресом в заголовке местоположения)