基于标头的 Apache 反向代理

基于标头的 Apache 反向代理

因此,我有一个适用于 99% 情况的 apache 配置。它检查请求中的标头值,并根据该值重定向到具有状态的正确 API 版本 URL 307。这适用于所有正确实现 http 堆栈的客户端。不幸的是,我有一个应用程序不遵循这一点,并将所有POST请求转换为GET

这就是proxy.conf我现在得到的:

RewriteEngine On
RewriteCond %{HTTP:X-Android-Version} =660
RewriteRule ^/services/6/(.*)$ /services/internal/6/$1 [R=307]

RewriteCond %{HTTP:X-Android-Version} >661
RewriteRule ^/services/6/(.*)$ /services/internal/7/$1 [R=307]


ProxyPass /services/internal/7 http://mbe700:8080/services/6
ProxyPass /services/internal/6 http://mbe600:8080/services/6

所以我想知道的是:

是否有可能在不使用 URL 重写规则的情况下实现相同类型的代理传递,因为在我的情况下这实际上不起作用?

答案1

事实证明这比我想象的要容易得多......只需改变重写规则上的标志似乎就可以了。

RewriteEngine On
RewriteCond %{HTTP:X-Android-Version} =660
RewriteRule ^/services/6/(.*)$ /services/internal/6/$1 [P]

RewriteCond %{HTTP:X-Android-Version} >661
RewriteRule ^/services/6/(.*)$ /services/internal/7/$1 [P]


ProxyPass /services/internal/7 http://mbe700:8080/services/6
ProxyPass /services/internal/6 http://mbe600:8080/services/6

答案2

你可以RewriteRule像 一样行事ProxyPass。因此你不需要重写为虚假 URL 然后使用ProxyPass代理:

RewriteEngine On

RewriteCond %{HTTP:X-Android-Version} =660
RewriteRule ^/services/6/(.*)$ http://mbe600:8080/services/6/$1 [P]

RewriteCond %{HTTP:X-Android-Version} >661
RewriteRule ^/services/6/(.*)$ http://mbe700:8080/services/6/$1 [P]

相关内容