如何用Apache重写代理安装中的位置响应头

我已经尝试了将近一个星期来解决这个问题。 基本上我有一个主要的代理服务器发送请求到安装OpeenSSO的辅助代理。

如果OpenSSO代理确定用户未login,则会向authentication服务器发出302redirect,并提供用户在redirect位置标头中作为GET参数请求的原始(编码)URL。

但是,GETvariables中的URL是内部(辅助)代理服务器的URL,而不是原始代理服务器。 因此,我想编辑/重写“位置”响应标题以提供正确的URL。

例如

  1. http://a.com/hello/ (原始请求的URL)
  2. http://a.com/hello2/ (使用OpenSSO代理的辅助代理)
  3. http://auth.a.com/login/?orig_request=http%3A%2F%2Fa.com%2Fhello2%2F(302redirect到auth服务器,请求的第二个代理服务器的URL使用GETvariables编码)
  4. http://auth.a.com/login/?orig_request=http%3A%2F%2Fa.com%2Fhello%2F (编码的URL被重写为原始请求的URL)

我已经尝试了几乎所有的标题和重写组合,没有运气,所以我想这可能是不可能的。 我得到的最接近的是这个,但是mod_headers编辑函数并不parsing环境variables。

# On the primary proxy. RewriteEngine On RewriteRule ^/(.*)$ - [E=orig_request:$1,P] Header edit Location ^(http://auth\.a\.com/login/\?orig_request=).*$ "$1http%3A%2F%2Fa.com%2F%{orig_request}e" 

ProxyPassReverse

ProxyPassReverse应该为你做这件事:

这个指令让Apache调整HTTP重定向响应的Location,Content-Location和URI头中的URL。

我不知道为什么你的反向代理不是这样的行为,假设你使用一对ProxyPass和ProxyPassReverse指令来定义它。

编辑位置标题

如果您希望能够像描述的那样编辑位置标题,那么您可以从Apache 2.4.7开始 :

对于编辑,有一个正则表达式的值参数和一个额外的替换字符串。 从版本2.4.7开始,替换字符串也可能包含格式说明符。

文档中提到的“格式说明符”包括能够使用环境变量,例如%{VAR}e

您可能还需要考虑修改您的应用程序,使orig_request URL参数相对化,因此可能无需使用环境变量对标题进行编辑。

相对路径位置标题

您也可以尝试在您的位置标题中使用相对路径,这将消除将一个域明确映射到另一个域的需要。 这在RFC 7231 (2014年6月)中是正式有效的 , 但在此之前得到了广泛的支持 。 您可以使用Apache Header edit指令(甚至在版本2.4.7之前,因为它不需要环境变量替换)相对化您的位置标头。 这看起来像这样:

 Header edit Location "(^http[s]?://)([a-zA-Z0-9\.\-]+)" ""