Обратный прокси IIS получает 404 от NodeJS за ним
Я знаю, что есть много статей об обратном прокси, есть много вещей о InBound
а также OutBound
но я хотел бы знать, что я сделал не так.
У меня есть сервер NodeJs, который доступен на http://192.168.0.1:3000
Когда я создаю обратный прокси-сервер с помощью ферм серверов, как показано ниже
Образец: *
Тип действия: Route To Server Farm
Схема: http
Ферма серверов: FarmName
Путь: {R:0}
когда я просматриваю http://localhost
все работает как шарм, но проблема основана на запросе субдомена или подпапки.
Я хочу прокси http://localhost/site/sub1
в http://192.168.0.1:3000
Я установил InBound
а также OutBound
правила как ниже:
<rewrite>
<globalRules>
<rule name="ARR_testd_loadbalance" enabled="true" stopProcessing="true">
<match url="^site/sub1(.*)" />
<action type="Rewrite" url="http://192.168.0.1:3000/{R:1}" />
<serverVariables>
<set name="HTTP_X_ORIGINAL_ACCEPT_ENCODING" value="{HTTP_ACCEPT_ENCODING}" />
<set name="HTTP_ACCEPT_ENCODING" value="" />
</serverVariables>
</rule>
<rule name="query" stopProcessing="true">
<match url="^sockjs/(.*)" />
<action type="Rewrite" url="http://192.168.0.1:3000/sockjs/{R:1}" />
</rule>
</globalRules>
<outboundRules>
<rule name="RewriteAbsoluteUrlsInResponse" preCondition="ResponseIsHtml1">
<match filterByTags="A, Area, Base, Form, Frame, Head, IFrame, Img, Input, Link, Script" pattern="^http(s)?://192.168.0.1(\:3000)?/(.*)" />
<action type="Rewrite" value="/site/sub1/{R:3}" />
</rule>
<rule name="RewriteRelativePaths" preCondition="ResponseIsHtml1">
<match filterByTags="A, Area, Base, Form, Frame, Head, IFrame, Img, Input, Link, Script" pattern="^/(.*)" negate="false" />
<action type="Rewrite" value="/site/sub1/{R:1}" />
</rule>
<rule name="Restore-AcceptEncoding" preCondition="NeedsRestoringAcceptEncoding">
<match serverVariable="HTTP_ACCEPT_ENCODING" pattern="^(.*)"></match>
<action type="Rewrite" value="{HTTP_X_ORIGINAL_ACCEPT_ENCODING}"></action>
</rule>
<preConditions>
<preCondition name="NeedsRestoringAcceptEncoding">
<add input="{HTTP_X_ORIGINAL_ACCEPT_ENCODING}" pattern=".+" />
</preCondition>
<preCondition name="ResponseIsHtml1">
<add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/(.+)" />
</preCondition>
</preConditions>
</outboundRules>
</rewrite>
основываясь на вышеприведенных правилах, я все еще вижу ошибку с сервера NodeJs как: Когда страница загружается с NodeJS, она показывает мне 404
ошибка как:
Ошибка 404
К сожалению, страница не найдена
Извините, запрашиваемая вами страница не существует или была удалена!
а в приватном Ракетном сервере я вижу
[34mI20190129-17:17:04.122(3.5) rocketchat:logger server.js:199 [34mMeteor ➔ метод public-settings/get -> userId: null, аргументы: [] [34mI20190129-17: 17: 04.125 (3.5) meteor_autoupdate_clientVersions {id: 'TFhMadFtuynon7rHB', clientAddress: '192.168.0.201', httpHeaders: { referer: ' http://localhost/site/sub1', 'x-forwarded-for': '[::1]:3704,192.168.0.201 ',' x-forwarded-host ':' 192.168.0.9:3000 ',' x-forwarded-port ':' 3000 ',' x-forwarded-proto ':' http ', host:' 192.168.0.9: 3000 ',' user-agent ':' Mozilla / 5.0 (Windows NT 10.0; Win64; x64) AppleWebKit / 537.36 (KHTML, как Gecko) Chrome/70.0.3538.102 Safari/537.36 OPR/57.0.3098.116', 'accept- язык ': 'en-US,en;q=0,9' }, userId: null }
и если RewriteAbsoluteUrlsInResponse
а также RewriteRelativePaths
работают, почему я получаю 404
ошибка от NodeJS?
1 ответ
Я не знаю, почему это не работает на самом деле, когда я включил обратный прокси на любом адресе *
подстановочный знак все работает хорошо, я думаю, что-то произошло в модуле ARR, который нарушается, когда я хочу, чтобы обратный работает site/sub1
, после многих попыток, таких как проверка сетевых пакетов Wireshark на частном сервере, чтобы найти не удалось http
запросы, определяющие правила outbounds и inbounds и т. д., это все еще не работает.
Я должен реализовать обходной путь, чтобы сделать выше сценарий:
Создание двух сайтов на разных портах 80
а также 81
расположен в:C:\inetpub\wwwroot
а также C:\inetpub\wwwroot1
Первый - это основной сайт, который просматриваетhttp://localhost/site
а второй доступен http://localhost:81/reversesite
в конце определения обратного правила в web.config
из C:\inetpub\wwwroot1
(реверсит) как ниже:
<rewrite>
<rules>
<rule name="ReverseProxyInboundRule1" stopProcessing="true">
<match url="(.*)" />
<action type="Rewrite" url="http://192.168.0.1:3000/{R:1}" />
</rule>
</rules>
</rewrite>
просматривая http://localhost:81
это будет прокси http://192.168.0.1:3000
и нет никаких 404
ошибка.
во всяком случае в http://localhost/site
Я могу позвонить любой API или адрес от http://192.168.0.1:3000
от http://localhost:81
но когда я пытался сделать наоборот http://localhost/site/sub1
это не сработало, как описано в вопросе.