我有一个主代理,它将请求发送到安装了OpenSSO的辅助代理。
如果OpenSSO代理确定用户未登录,则会引发302重定向到身份验证服务器,并在重定向位置标头中提供用户请求的原始(编码)URL作为GET参数。
但是,GET变量中的URL是内部(辅助)代理服务器的URL,而不是原始代理服务器的URL。因此,我想编辑/重写“Location”响应标头以提供正确的URL。
例如:
- http://a.com/hello/(原始请求的URL)
- http://a.com/hello2/(安装了OpenSSO代理的辅助代理)
- http://auth.a.com/login/?orig_request=http%3A%2F%2Fa.com%2Fhello2%2F(302重定向到带有编码的第二个代理服务器的请求URL的身份验证服务器)
- 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"
Header edit Location "(^http[s]?://)([^/]+)" ""
- grtjnLocation
块中使用ProxyPassReverse
会导致重定向返回到代理链中负载均衡器的IP,而不是外部FQDN。使用Header edit Location
完美地解决了这个问题,而且感觉更直观。感谢您的帖子。 - halfer