如何使用Apache重写代理设置中的位置响应头?

时间:2013-04-30 10:04:17

标签: apache url-rewriting reverse-proxy response-headers

我有一个主代理,它将请求发送到安装了OpeenSSO的辅助代理。

如果OpenSSO代理确定用户未登录,则会将302重定向提升到身份验证服务器,并提供用户在重定向位置标头中请求的原始(编码)URL作为GET参数。

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

E.g。

  1. http://a.com/hello/(原始请求的网址)
  2. http://a.com/hello2/(使用OpenSSO代理的辅助代理)
  3. http://auth.a.com/login/?orig_request=http%3A%2F%2Fa.com%2Fhello2%2F(302重定向到使用GET变量编码的第二代理服务器的请求URL的auth服务器)
  4. http://auth.a.com/login/?orig_request=http%3A%2F%2Fa.com%2Fhello%2F(编码的网址会被重写为原始请求的网址)
  5. 我已经尝试过几乎所有标题和重写的组合而没有运气,所以我认为这可能是不可能的。我得到的最接近的是这个,但mod_headers编辑函数不解析环境变量。

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

1 个答案:

答案 0 :(得分:16)

ProxyPassReverse

ProxyPassReverse应该为您完成此操作:

  

此指令允许Apache调整HTTP重定向响应的位置,内容位置和URI标头中的URL。

我不确定为什么你的反向代理不会以这种方式表现,假设你正在使用一对ProxyPass和ProxyPassReverse指令来定义它。

编辑位置标题

如果您希望能够按照描述编辑位置标题,则可以as of Apache 2.4.7执行此操作:

  

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

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

您可能还需要考虑修改应用程序,以便对orig_request URL参数进行相对化处理,从而可能无需使用环境变量进行Header编辑。

相对路径位置标头

您还可以尝试在Location标头中使用相对路径,这样就无需将一个域明确映射到另一个域。这是正式有效的as of RFC 7231(2014年6月),but was was widely supported even before that。您可以使用Apache Header edit指令(甚至在版本2.4.7之前,因为它不需要环境变量替换)来相对化您的Location标头。这看起来像这样:

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