Php “用户”中的用户名:pass@example.com`不在$\u服务器中

Php “用户”中的用户名:pass@example.com`不在$\u服务器中,php,apache,basic-authentication,Php,Apache,Basic Authentication,首先,我的服务器没有在CGI模式下运行PHP。即使是这样,我也有适当的mod_重写设置(这是一个Drupal站点) 我的问题是,当用户/通行证以http://user:pass@com则它们不会显示在任何$\u服务器的值中。不在PHP\u AUTH\u USER中,不在HTTP\u AUTHORIZATION中,不在REMOTE\u USER中,也不在超全局范围内的任何其他地方 如果通过浏览器的HTTP basic auth对话框或直接使用base64编码的授权:basic ZxHbXBSzTp

首先,我的服务器没有在CGI模式下运行PHP。即使是这样,我也有适当的mod_重写设置(这是一个Drupal站点)

我的问题是,当用户/通行证以
http://user:pass@com
则它们不会显示在任何
$\u服务器的值中。不在
PHP\u AUTH\u USER
中,不在
HTTP\u AUTHORIZATION
中,不在
REMOTE\u USER
中,也不在超全局范围内的任何其他地方

如果通过浏览器的HTTP basic auth对话框或直接使用base64编码的
授权:basic ZxHbXBSzTpLegFTCGXL
HTTP头传递凭据,则一切正常,`$_服务器['HTTP_auth_用户']已填写,一切正常。但是如果用户/通行证是通过URL传递的,那么这是不可能的

你知道这里会发生什么吗

PHP 5.3.10
Apache 2.2.22

您是否需要有效的用户?在这样的街区

AuthType Basic
AuthName "By Invitation Only"
# Optional line:
AuthBasicProvider file
AuthUserFile /usr/local/apache/passwd/passwords
AuthGroupFile /usr/local/apache/passwd/groups
Require group GroupName

您可以发布相关的httpd.conf块吗?

tl;dr:缓存
401未经授权的
响应使我误以为身份验证代码有问题,而实际上没有问题,它只是一遍又一遍地发送缓存的身份验证失败响应,尽管凭据正确。禁用缓存修复了该问题


在上下文中,这一切都是为了一个API。基本上,Drupal正在积极缓存来自API的响应,包括
401未经授权的
响应。但我没有注意到授权失败的原因是由于缓存,我看到了两个不同的问题:响应缓存不正确,授权在某些情况下不起作用

这是在生产环境中进行的,因此在我的开发环境中,我禁用了API的缓存,然后开始解决授权问题,没有意识到我已经解决了它。作为一种调试方法,我缩短了响应,这样API就不会实际检查HTTP基本身份验证凭据,它只会输出调试信息(
$\u SERVER
)。因为服务器不再在应该的时候发送
401 Unauthorized
,Safari没有打包用户并将URL作为HTTP授权头传递。但我还没有意识到这一点

因此,Safari在一个使用Apache处理HTTP Basic Auth的站点上使用URL中的user/pass,但它不使用我的PHP API。这让我觉得Apache正在吃掉URL中的身份验证,而没有将其发送出去。这个想法就是产生这个问题的原因

多亏了和对这个问题的评论,我意识到了我的错误,并测试了实际发送
401未经授权的状态码和low,瞧,Safari正在与URL中的用户/pass一起工作


在开发API时,我没有注意到缓存,因为我登录了Drupal站点,该API是基于该站点构建的,Drupal只为匿名用户进行完整页面缓存。有趣的是,即使是Chrome应用程序,它就像一个独立的应用程序,也会从主Chrome应用程序发送cookie。当我发送请求时,我甚至没有意识到我已登录到该站点。

您使用什么浏览器进行测试?你试过其他的吗?Chrome(编辑:更好的链接)。我相信这是为了防止url欺骗<代码>http://www.google.com :secure@example.com/
我尝试过使用Safari和一些工具来发送HTTP请求。浏览器的工作是将URL的这些部分转换为适当的授权头。它们没有在URL中发送到服务器。因此,如果浏览器没有这样做,您就无法在服务器上进行恢复。@Basic,因为我发送的
401
不一致。当我不发送
401
时,它从未出现过。当时我不清楚在URL中嵌入user/pass是浏览器的一项功能,而不是服务器的一项功能。我不是用Apache来处理身份验证,而是用PHP。如果请求中尚未包含凭据,则站点将以
401 Unauthorized
响应。