Обратный прокси IIS получает 404 от NodeJS за ним - PullRequest
0 голосов
/ 29 января 2019

Я знаю, что есть много статей об обратном прокси, есть много вещей о 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>

на основе вышеуказанных правил Я все еще вижу ошибку с сервера NodeJsas: Когда страница загружается из NodeJS, она показывает мне ошибку 404, такую ​​как:

Ошибка: 404
Упс, страница не найдена
Извините, запрошенная страница не существует илибыл удален!

и на частном сервере Rocket я вижу

[34mI20190129-17: 17: 04.122 (3.5) rocketchat: logger server.js: 199 [34mMeteor ➔ метод public-settings / get -> userId: null, arguments: [] [34mI20190129-17: 17: 04.125 (3.5) meteor_autoupdate_clientVersions {id: 'TFhMadFtuynon7rHB', clientAddress: '192.168.0.201', httpHeaders: {* '48 * refe: {* '48 * referer: {* '48 * refehttp://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 ', хост:' 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-language ':' en-US, en; q = 0,9 '}, userId: null}

и если RewriteAbsoluteUrlsInResponse и RewriteRelativePaths работают, почему я получаю ошибку 404 от NodeJS?

1 Ответ

0 голосов
/ 02 февраля 2019

Я не знаю, почему это не работает на самом деле, Когда я включил Обратный прокси на любом адресе * Подстановочный знак, все работает хорошо, я думаю, что-то случилось в модуле 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 это не сработало, как описано в вопросе.

...