Nexus Repository OSS обратный прокси
У меня есть сервер Windows Server 2012-R2, на котором работает Nexus Repository OSS localhost:8081
, Я настроил обратный прокси-сервер в IIS со следующим правилом:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="ReverseProxyInboundRule1" stopProcessing="true">
<match url="(.*)" />
<action type="Rewrite" url="http://localhost:8081/{R:1}" />
</rule>
</rules>
<outboundRules>
<preConditions>
<preCondition name="ResponseIsHtml1">
<add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/html" />
</preCondition>
</preConditions>
</outboundRules>
</rewrite>
</system.webServer>
</configuration>
Когда я захожу на сайт из другой системы и перехожу на nexus.mycompany.com, я вижу работающий прокси... в основном. Все зависимые CSS, JS и т. Д. Все localhost:8081
что, конечно, удаленная машина не может разрешить.
Я попытался добавить исходящее правило, надеясь, что это решит проблему, но не сделал этого.
<rule name="ReverseProxyOutboundRule1" preCondition="ResponseIsHtml1">
<match filterByTags="A, Form, Img" pattern="^http(s)?://localhost:8081/(.*)" />
<action type="Rewrite" value="http{R:1}://nexus.mycompany.com/{R:2}" />
</rule>
Глядя на документацию, я попытался установить базовый URL. Описанная кнопка не отображается в графическом интерфейсе. Я нашел статью переполнения стека, объясняющую, что она была перемещена в раздел "Возможности". Я добавил базовый URL через возможности, и он все еще не работает.
Я перезапустил службу Windows после каждого изменения.
Я хочу сделать, чтобы хранилище было доступно через имя хоста и чтобы оно загружалось соответствующим образом. Я что-то упускаю здесь очевидное? Есть ли какая-то другая причина, почему он использует полные URL-адреса вместо относительных URL-адресов?
1 ответ
В настройке обратного прокси, Nexus ищет наличие различных X-Forwarded-*
Заголовки HTTP для определения его базового URL. Если вы правильно установили эти заголовки, он должен выдавать правильные URL-адреса, без исходящих правил.
Хитрость заключается в том, чтобы узнать, какие из них нужно пройти - документация об обратном прокси-сервере не кажется особенно ясной в отношении того, что это такое, они просто предлагают образцы nginx и Apache без особых объяснений. Я подозреваю, что nginx и Apache автоматически устанавливают необходимые заголовки, и Nexus принял их. Это все "стандарт де-факто", а не формальный, поэтому, хотя вы видите достаточную согласованность, в которой заголовки поддерживаются в разных приложениях, это не гарантируется.
Вот два, которые мне нужны в моем случае:
X-Forwarded-Host
сообщает Nexus исходный хост, запрошенный клиентом. Это будет "nexus.mycompany.com" в вашем примере.X-Forwarded-Proto
может использоваться, чтобы сообщить Nexus, что исходный запрос (т. е. к вашему прокси) был HTTPS, даже если сам Nexus не запускает HTTPS. Если ваш прокси не HTTPS, то вам это не нужно.
Заголовки задаются в разделе "Переменные сервера" - замените тире подчеркиванием и добавьте "HTTP_" на лицевой стороне, X-Forwarded-Host
становится HTTP_X_Forwarded_Host
,
Таким образом, правило будет выглядеть так:
<rule name="ReverseProxyInboundRule1" stopProcessing="true">
<match url="(.*)" />
<action type="Rewrite" url="http://localhost:8081/{R:1}" />
<serverVariables>
<set name="HTTP_X_Forwarded_Proto" value="https" />
<set name="HTTP_X_Forwarded_Host" value="nexus.mycompany.com" />
</serverVariables>
</rule>
Опять же, возьмите Proto, если ваш обратный прокси-сервер не HTTPS.
Когда эти заголовки установлены, вам не нужно исходящее правило, которое, как вы заметили, не в состоянии уловить многое из того, что происходит в файлах Javascript.
В заключение, возможно, вы захотите оставить эту возможность Base URL там - в соответствии с документами, которые она использует для нескольких вещей.