Назад | Перейти на главную страницу

Перезапись URL-адреса Apache2 с использованием обратного прокси

Я пытался достичь цели использования Apache в качестве обратного прокси для преобразования HTTP в HTTPS, а также использования mod_rewrite для ввода строки запроса.

Обратный прокси-сервер работает, если протестирован без перезаписи. Однако при добавлении перезаписи Apache, похоже, зацикливает строку запроса и добавляет ее несколько раз. Это фактически повторяется и порождает максимальное количество рабочих потоков, пока я не остановлю службу принудительно.

Когда я принудительно останавливаю Apache, в моем браузере появляется следующее:

Proxy Error
The proxy server received an invalid response from an upstream server.
The proxy server could not handle the request GET /api/uuid.

Reason: Error reading from remote server

Однако вышестоящий сервер никогда не видит этот запрос GET.


Мой VirtualHost выглядит следующим образом:

<VirtualHost *:80>
    RewriteEngine On
    RewriteRule ^/api/uuid /api/uuid?var=testing [P,QSA]
    SSLProxyEngine On
    SSLProxyVerify none
    SSLProxyCheckPeerCN off
    SSLProxyCheckPeerName off
    SSLProxyCheckPeerExpire off
    ProxyPreserveHost On

    ProxyPass / https://192.168.47.108:8443
    ProxyPassReverse / https://192.168.47.108:8443

</VirtualHost>

Исходный запрос GET

http://192.168.47.118/api/uuid?domain=lab.local

Вырезать из access_log

192.168.47.118 - - [15/Sep/2018:01:27:36 -0500] "GET /api/uuid?var=testing&var=testing&var=testing&var=testing&var=testing&var=testing&var=testing&domain=lab.local HTTP/1.1" 502 395 "-"

Несмотря на то, что я использовал [P], что подразумевает [L], и даже явное [L] ([QSA, P, L]), Apache зацикливал запрос.

Я сделал условие перезаписи, которое проверяет, была ли переменная уже в запросе.

Мое рабочее решение:

<VirtualHost *:80>
        RewriteEngine On
        RewriteCond %{QUERY_STRING} !domain
        RewriteRule ^/api/uuid /api/uuid?domain=test.local [P,QSA]
        SSLProxyEngine On
        SSLProxyVerify none
        SSLProxyCheckPeerCN off
        SSLProxyCheckPeerName off
        SSLProxyCheckPeerExpire off
        ProxyPreserveHost On

        ProxyPass / https://192.168.47.108:8443/
        ProxyPassReverse / https://192.168.47.108:8443/

</VirtualHost>

Вам нужно остановить процесс перезаписи, теперь он продолжает добавлять вашу строку запроса (она рекурсивна). Я бы тоже сбросил флаг P (принудительная отправка URL-адреса замены внутри как прокси-запроса).

    RewriteRule ^/api/uuid /api/uuid?var=testing [L,QSA]

Обратите внимание, что если бы что-нибудь после / apid / uuid, кроме параметров запроса, было бы потеряно, например. '/ api / uid / tralala', вы потеряете '/ tralala'.

Если вам нужен флаг Proxy, вам нужно будет указать внутренний сервер, как в

RewriteRule ^/api/uuid https://192.168.47.108:8443/api/uuid?var=testing [P,QSA]

и удалите директиву ProxyPass.