Apache2 URL переписать с обратным прокси
Я пытался достичь цели, используя 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 "-"
2 ответа
Хотя я использовал [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.