web-dev-qa-db-ja.com

リバースプロキシを使用したApache2URLの書き換え

私は、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 "-"
1
Suterusu

[L]を意味する[P]を使用していても、明示的な[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>
1
Suterusu

書き換えプロセスを停止する必要があります。これで、クエリ文字列が追加され続けます(再帰的です)。 Pフラグも削除します(置換URLをプロキシ要求として内部的に送信するように強制します)。

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

クエリパラメータを除いて/ apid/uuidに続くものがあれば、それは失われることに注意してください。 '/ api/uid/tralala'、 '/ tralala'を失います。

プロキシフラグが必要な場合は、次のようにバックエンドサーバーを指定する必要があります。

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

proxyPassディレクティブを削除します。

0
Gerard H. Pille