17

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

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

但是,GET 变量中的 URL 是内部(辅助)代理服务器的 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(302重定向到身份验证服务器,请求的第二个代理服务器的 URL 编码在 GET 变量中)
  4. http://auth.a.com/login/?orig_request=http%3A%2F%2Fa.com%2Fhello%2F(编码的 URL 被重写为原始请求的 URL)

我已经尝试了几乎所有标题和重写的组合,但没有运气,所以我认为这可能是不可能的。我得到的最接近的是这个,但是 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"
4

1 回答 1

23

ProxyPassReverse

ProxyPassReverse应该为您执行此操作:

该指令允许 Apache 调整 HTTP 重定向响应的 Location、Content-Location 和 URI 标头中的 URL。

假设您使用一对 P​​roxyPass 和 ProxyPassReverse 指令来定义它,我不确定为什么您的反向代理没有这样做。

编辑位置标题

如果您希望能够按照您的描述编辑 Location 标头,您可以从 Apache 2.4.7开始执行此操作:

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

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

您可能还需要考虑修改您的应用程序,以使 orig_request URL 参数相对化,从而可能消除使用环境变量编辑 Header 的需要。

相对路径位置标题

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

Header edit Location "(^http[s]?://)([a-zA-Z0-9\.\-]+)(:\d+)?/" "/"
于 2015-03-05T13:50:08.543 回答