Обратный прокси 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
К сожалению, страница не найдена
К сожалению, запрошенная страница не существует или была удалена!

и на частном сервере 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: {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-language ':' en-US, en; q = 0.9 '}, userId : нулевой }

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


person Aria    schedule 29.01.2019    source источник


Ответы (1)


Я не знаю, почему это не работает на самом деле. Когда я включил обратный прокси на любом адресе * подстановочный знак, все работает нормально, я думаю, что что-то произошло в модуле ARR, что нарушается, когда я хочу, чтобы обратный прокси работал на site/sub1, после многих попыток например, проверка сетевых пакетов с помощью Wireshark на частном сервере для поиска http неудачных запросов, определение правил исходящих и входящих пакетов и т. д. это все еще не работает.

Мне нужно реализовать обходной путь для выполнения вышеуказанного сценария:

Создание двух веб-сайтов на разных портах 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, это не сработало, как описано в вопросе.

person Aria    schedule 02.02.2019