Apache2 使用反向代理进行 URL 重写

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 "-"

答案1

即使我使用了隐含 [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>

答案2

您需要停止重写过程,现在它会不断附加您的查询字符串(它是递归的)。我也会删除 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 指令。

相关内容