Рейтинг:0

Обратный прокси-сервер Apache - URL без / отклонен

флаг us

Я использую обратный прокси-сервер, чтобы показать содержимое внутреннего сервера для поддомена. Subdomain.mydomain.com (сервер A) должен отображать содержимое сервера с IP-адресом 123.123.123.123, порт 1111 (сервер B).

Виртуальный хост subdomain.mydomain.com (сервер A):

<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName subdomain.mydomain.com

SSLEngine on
SecAuditEngine On
RewriteEngine On
SSLProxyEngine on
ProxyPreserveHost On
LogLevel warn

<Directory />
    Options -Indexes +FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>

<Location />
    ProxyPass https://123.123.123.123:1111
    ProxyPassReverse https://123.123.123.123:1111
</Location>

ErrorLog /var/log/apache2/error.log

SSLProtocol             all -SSLv2 -SSLv3
SSLHonorCipherOrder     on
SSLVerifyClient none
SSLVerifyDepth 1

SSLCertificateFile /etc/apache2/cert.site/chain_wildcard_site_combined.crt
SSLCertificateKeyFile /etc/apache2/cert.site/key_wildcard_site.key
 
SetEnvIf User-Agent ".*MSIE.*" \
         nokeepalive ssl-unclean-shutdown \
         downgrade-1.0 force-response-1.0

</VirtualHost>                                  
</IfModule>

Виртуальный хост 123.123.123.123:1111 (сервер B):

<IfModule mod_ssl.c>
    <VirtualHost 123.123.123.123:1111>
        DocumentRoot /srv/www/site/htdocs

SSLEngine on
RewriteEngine On
SSLProxyEngine on
ProxyPreserveHost On
LogLevel warn

<Location "/">
   Require ip 222.222.222.222
</Location>

<Directory />
    Options FollowSymLinks
    AllowOverride None
</Directory>

<Directory /srv/www/site/htdocs>
    Options -Indexes +FollowSymLinks +MultiViews
    DirectoryIndex index.php
    AllowOverride None
    Require all granted
</Directory>

ErrorLog /srv/www/site/log/error.log
CustomLog /srv/www/site/log/access.log combined
CustomLog /srv/www/site/log/ssl_request_log \
            "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"

SSLProtocol             all -SSLv2 -SSLv3
SSLHonorCipherOrder     on
SSLVerifyClient none
SSLVerifyDepth 1

SSLCertificateFile /etc/apache2/cert.site/chain_wildcard_site_combined.crt
SSLCertificateKeyFile /etc/apache2/cert.site/key_wildcard_site.key

        <Directory /usr/lib/cgi-bin>
                SSLOptions +StdEnvVars
        </Directory>

    </VirtualHost>
</IfModule>

Если я загружаю URL: https://subdomain.mydomain.com/dir/

он успешно загружается.

Если я загружаю URL (без косой черты): https://subdomain.mydomain.com/каталог

это приводит к странице с ошибкой: ERR_CONNECTION_REFUSED.

РЕДАКТИРОВАТЬ1:

Выполняю команду:

curl -IL https://subdomain.mydomain.com/dir

и я получаю этот результат:

HTTP/1.1 301 перемещен навсегда
Дата: пн, 23 августа 2021 г., 13:45:13 по Гринвичу
Сервер: Апач
Строгая транспортная безопасность: max-age=15768000; includeSubDomains
Строгая транспортная безопасность: max-age=15768000; includeSubDomains
Местоположение: https://subdomain.mydomain.com:1111/dir/
Тип содержимого: текст/html; кодировка = iso-8859-1

curl: (7) Не удалось подключиться к порту 1111 subdomain.mydomain.com: соединение отклонено

РЕДАКТИРОВАТЬ2:

я добавил косую черту в конце

<Location />
    ProxyPass https://123.123.123.123:1111/
    ProxyPassReverse https://123.123.123.123:1111/
</Location>

Но я все еще получаю В соединении отказано ошибка.

Любая идея, почему возникает ошибка, когда косая черта отсутствует?

Спасибо!

Chris avatar
флаг it
Я бы попробовал добавить завершающую косую черту к директивам ProxyPass/ProxyPassReverse в вашем блоке местоположения. Из того, что я вижу в документе и собственной конфигурации, вы можете написать `ProxyPass "/" "something_with_trailing_slash/"` или `ProxyPass "/url" "something_without_trailing_slash"`, в то время как блок вашего местоположения эквивалентен `ProxyPass "/" "something_without_trailing_slash`
klor avatar
флаг us
Ранее я использовал `ProxyPass "/" "something_with_trailing_slash/"` с тем же неправильным результатом.
mforsetti avatar
флаг tz
выполните как `curl -IL https://subdomain.mydomain.com/dir`, так и `curl -IL https://subdomain.mydomain.com/dir/` и отредактируйте вопрос, чтобы включить вывод.
klor avatar
флаг us
@mforsetti добавил результат скручивания в OP
Рейтинг:1
флаг cm

Просмотрите настройки брандмауэра и журналы вашего сервера на сервере B и убедитесь, что сервер A может связаться с сервером B с правильным IP-адресом отправителя (я предполагаю, что это 222.222.222.222). В ваших списках для сервера B также отсутствует Слушай 1111 https директива.

редактировать Бэкенд-сервер принудительно перенаправляет:

HTTP/1.1 301 перемещен навсегда
Местоположение: https://subdomain.mydomain.com:1111/dir/

Присутствие заголовка HSTS и отсутствие каких-либо правил перезаписи заставляет меня предположить, что это приложение выполняет перенаправление.

Уточните, что это такое.

Вы заявили, что с добавленным '/' все работает нормально. Принуждение завершающего '/' с помощью mod_rewrite на внешнем сервере кажется мне приемлемым решением.

klor avatar
флаг us
Я забыл упомянуть, что прослушивание 1111, 443 настраивается отдельно в ports.conf. Я не думаю, что это проблема брандмауэра, так как он работает для /dir/, но не работает для /dir
флаг cm
Узнайте, что вызывает перенаправление, которое вы испытываете, в соответствии с выходными данными `curl`. Очень вероятно, что это внутренний сервер (неочевидно из опубликованных вами фрагментов конфигурации) или само приложение, которое заставляет его. Применение завершающего `/` с помощью правил перезаписи может быть приемлемым обходным путем.
Рейтинг:0
флаг no

Похоже, на это уже был дан ответ здесь. Тем не менее, чтобы ответить на ваш вопрос,

Вам не хватает косой черты в конце директив ProxyPass и ProxyPassReverse.

Читать это если вам нужна дополнительная информация о том, почему это так.

klor avatar
флаг us
Я проверил ваше предложение, но все равно получаю ошибку. См. модифицированный ОП.
Рейтинг:0
флаг fk

Ваш обратный прокси-сервер не прослушивает (вероятно, не должен) порт 1111.

Тем не менее, ваш сервер 123 перенаправляется на порт 1111 (предположение, основанное на опубликованных вами конфигурациях).

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.