我正在测试一个托管在生产环境中的 Web 应用程序网站管理员,它对用户进行身份验证,并向每个请求添加一个可识别该用户的 HTTP 标头。
如果不存在标题,则应用程序将无法工作,我正在尝试使用Watir 和 Webdriver。此组合在本地驱动真实浏览器(例如 Firefox),因此我无法通过 WebDriver 轻松插入 HTTP 标头。我们的本地测试环境没有 SiteMinder,因此我需要一种插入标头的方法。
我已经将 Apache 2 设置为反向代理,并想要转换如下请求:
GET /[email protected]/application/index.html
进入:
GET /application/index.html
SM_USER: [email protected]
我们的服务器都是 Solaris 10,我目前正在使用与操作系统一起安装的 Apache/2.0.63(我们没有将它用于其他任何用途)。
我最接近的方法是使用SetEnvIf
和mod_rewrite
:
SetEnvIf Request_URI "SM_USER=([^/]+)" HTTP_SM_USER=$1
RewriteEngine on
RewriteRule ^/.+(/application/.+)$ http://apphost:9090$1 [P]
但未设置标头。似乎Request_URI
正在重写的值前该SetEnvIf
指令正在执行,因此SM_USER
不再在 URI 中。
如果我是对的,是否可以更改执行顺序以SetEnvIf
获取原始 URI?还是我需要采用其他方法?
答案1
我的同事想出了一个解决方案。我错误地认为SetEnvIf
单独使用就足够了。现在这对我们有用:
RewriteEngine on
# Anything ending with /application/.+ goes to http://apphost:9090
RewriteRule ^/.+(/application/.+)$ http://apphost:9090$1 [P]
# Match SM_USER= in the URI and set an env var with its value.
SetEnvIf Request_URI "SM_USER=([^/]+)" SM_USER=$1
# If the env var is set, put the value into a request header.
RequestHeader set SM_USER "%{SM_USER}e" env=SM_USER
此 URIhttp://apphost:9090/application/index.html
通过 HTTP 标头SM_USER
设置为代理[email protected]
:
/[email protected]/application/index.html