Apache 2.2:RewriteMap,ProxyPass插值和Keep-Alive

我有一个Apache httpd用作很多后端的SSL反向代理前端。 我从用户给出的path计算后端的名字。 例如: https://myhostname.com/myaccount : https://myhostname.com/myaccount转换为http://myaccount.myhostname.com

为此,我使用了一个RewriteMapRewriteRule ,并打开了[P]标记。 一切工作正常。

不过,我现在需要反向代理和后端之间的持续连接。 我很清楚保持活着与RewriteRule[P] ( http://httpd.apache.org/docs/current/en/rewrite/flags.html#flag_p – 性能警告)不起作用,所以我试过使用ProxyPass和环境variables插值来完成工作。 我得到了一个RewriteRule ,除了将映射结果保存到一个环境variables,然后使用这个variables调用ProxyPass之外什么都不做。

 RewriteMap mymap prg:/path/to/my/map RewriteCond %{REQUEST_URI} ^/([^/]+)/?.*$ RewriteCond ${mymap:%1} ^http://([^/]+/)$ RewriteRule ^/([^/]+)/?$ - [L,E=original:$1,E=rewritten:%1] ProxyPassInterpolateEnv On ProxyPassReverse /${original}/ http://${rewritten} interpolate 

这导致与[P] RewriteRule一样的行为:代理是好的,但不使用http保持活动。

我试着用一个硬编码的主机名来代替使用${rewritten} (但保留${original} ),并观察到这是使Apache创build新连接而不是重用现有连接的一部分。

这个错误: https : //issues.apache.org/bugzilla/show_bug.cgi?id = 43308提出了相同的问题,并提出一个补丁,可以解决我的问题。

不过,我想知道是否有人有一个想法来解决这个不同的/更好的方式。

当使用RewriteRule的[P]标志进行代理时,通常可以使用ProxySet指令设置通常通过ProxyPassconfiguration的选项。

但在这种情况下,您没有特定的代理URL来configuration。 如果您只是代理用户帐户,则可以执行以下操作:

 ProxyPassMatch /\w+/ http://$1.myhostname.com/ keeplive=on 

虽然从你的例子看来,可能有不同的域正在使用(因此使用RewriteMap )。

或者,刚刚发生的另一个想法,它可能会使用以下(未经testing):

 <Proxy *> ProxySet keepalive=on </Proxy>