我正在尝试使用 centos 6 上的 apache httpd 2.2 反向代理一个网站。应通过基本身份验证限制对该站点部分内容的访问。为此,我进行了以下配置:
<Location ~ "(/ac/sd|/myapp/pages)">
AuthType Basic
AuthName "Restricted area"
AuthBasicProvider file
AuthUserFile "/etc/httpd/passwords"
Require valid-user
</Location>
# restricted area
ProxyPass /ac/sd/pages/UI.php http://myapp-test.acme.org:8000/myapp/pages/UI.php
ProxyPassReverse /ac/sd/pages/UI.php http://myapp-test.acme.org:8000/myapp/pages/UI.php
ProxyPass /ac/sd/pages/logoff.php http://myapp-test.acme.org:8000/myapp/pages/logoff.php
ProxyPassReverse /ac/sd/pages/logoff.php http://myapp-test.acme.org:8000/myapp/pages/logoff.php
ProxyPass /ac/sd http://myapp-test.acme.org:8000/myapp
ProxyPassReverse /ac/sd http://myapp-test.acme.org:8000/myapp
ProxyPass /myapp/pages http://myapp-test.acme.org:8000/myapp/pages
ProxyPassReverse /myapp/pages http://myapp-test.acme.org:8000/myapp/pages
# unrestricted area
ProxyPass /ac/pages/UI.php http://myapp-test.acme.org:8000/myapp/portal/index.php
ProxyPassReverse /ac/pages/UI.php http://myapp-test.acme.org:8000/myapp/portal/index.php
ProxyPass /ac/pages/logoff.php http://myapp-test.acme.org:8000/myapp/portal/logoff.php
ProxyPassReverse /ac/pages/logoff.php http://myapp-test.acme.org:8000/myapp/portal/logoff.php
ProxyPass /ac/portal http://myapp-test.acme.org:8000/myapp/portal
ProxyPassReverse /ac/portal http://myapp-test.acme.org:8000/myapp/portal
ProxyPass /ac http://myapp-test.acme.org:8000/myapp
ProxyPassReverse /ac http://myapp-test.acme.org:8000/myapp
ProxyPass /portal http://myapp-test.acme.org:8000/myapp/portal
ProxyPassReverse /portal http://myapp-test.acme.org:8000/myapp/portal
反向代理部分可以正常工作,我已经在不使用身份验证的情况下进行了测试。此外,身份验证部分也可以正常工作,我已经使用一个简单的 index.html 进行了测试,该 index.html 没有使用代理,但位于获取上述配置的服务器上。
现在不起作用的是身份验证和反向代理。当我尝试使用 Web 浏览器访问网站时,会出现要求身份验证的弹出窗口,弹出文本中包含“受限区域”。我输入了凭据,片刻之后,没有加载任何内容,凭据弹出窗口再次出现,这次弹出文本中包含“myapp”。无论我输入什么,它都会再次弹出。因此,似乎第一次身份验证成功了,但出于某种原因,代理网站发送了另一个基本身份验证。这可能是我的误解——我真的不明白这里发生了什么。
我还尝试使用几乎相同的配置来反向代理 python simpleHTTPServer。反向代理和身份验证都起作用了。因此,似乎我的应用程序与代理或身份验证有关。但是,如果应用程序中没有基本身份验证,为什么它会不断弹出?
有任何想法吗?
答案1
在使用观察流量后tcpdump
,我发现确实是代理服务器正在发送另一个身份验证请求。
反向代理转发Authorization: Basic XXXXXXXXXXXXXXXXX
标头,应用程序将其视为有效的登录过程。但是,由于反向代理 htpassword 文件中的登录凭据与应用程序中存储的凭据不匹配,因此登录失败,应用程序发送另一个身份验证请求。
让我感到困惑的是,我以为基本身份验证请求会来自应用程序 Web 服务器 - 但事实并非如此。它在应用程序中 :)
答案2
它会弹出两次以上吗?重定向会导致弹出窗口再次显示。