因此,我有一个适用于 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]