我有一个 Web 服务器通过同一个 SSL VirtualHost 发布不同的服务,最常用的两个服务是 PhpMyAdmin 和 Cacti。这两个服务(以及其他服务)使用“cookie”类型的身份验证,以 HTML 表单形式询问用户和密码(因此不使用 HTTP 身份验证)。
由于使用相同的主机名,Safari 浏览器无法很好地管理存储的密码:如果我使用用户 foo 登录一个应用程序,然后转到应用程序二,它会在登录表单中向我推荐用户 foo 及其密码。过去,只需将用户名更改为 bar 就足以让 Safari 在其表单字段中自动填写正确的密码。这很烦人,但我可以忍受——与我们使用的密码相比,用户名很短,也容易记住。
在更新到 safari5 之后,这种情况似乎不再存在:如果我在 safari(实际上是 OSX 上的用户钥匙串)中存储https://www.foobarbaz.com/app1以及凭证https://www.foobarbaz.com/app2它似乎无法根据 URL 自动完成这两项操作。即使编辑钥匙串以添加路径(默认情况下它只会存储主机名)也无济于事。
我能做些什么让它按我想要的方式工作,同时仍然将所有内容保留在一个主机名上?当然可以修改服务器端的任何内容,但我无法将应用程序切换到 HTTP Auth(而且不是每个应用程序都支持它)以使用不同的“领域”。
答案1
我认为事物,在 HTTP 请求 URI 中,主机是方案(即 http://)和顶级域名结尾(即.com/
)之间的所有内容,主机右边的所有内容都是该主机要处理的请求。
解决您问题的最佳方法是使用子域 ..https://app1.foobarbaz.com/
和https://app2.foobarbaz.com
。您需要将子域放在域的 DNS 区域中,并在 Web 服务器上配置虚拟主机以使用和foobarbaz.com
处理请求。Apache 和 IIS 都可以完全满足您的需要,而无需重新配置应用程序。您可能必须获取(或创建)新证书才能使 SSL 正常工作,而不会出现浏览器安全错误。/app1
/app2
显然,根据(在我看来很愚蠢的)组织政策,这是不允许的。OP 应该努力改变这一政策,因为它与互联网的运作方式相冲突。
也就是说,另一种选择是修改每个应用程序以为其自身部署特定的 cookie,然后查看所有返回的 cookie 以找到适合自己的 cookie。如何做到这一点取决于平台,这是一个 StackOverflow 问题。
答案2
如果你指的是使用 HTTP 身份验证(而不是 HTML 表单),那么可以使用以下方法:你可以通过设置不同的方式使其工作身份验证领域以及 URL。如下所示:
<Location /abc/>
AuthType Basic
AuthName "Realm for ABC"
AuthUserFile /var/www/html/domain.org/abc/.htpasswd
require valid-user
</Location>
<Location /xxx/>
AuthType Basic
AuthName "Realm for XXX"
AuthUserFile /var/www/html/domain.org/xxx/.htpasswd
require valid-user
</Location>
有趣的是AuthName
。Safari 会记住/自动完成每个领域 (而不是每个域) 的 HTTP 身份验证对话框。