通常,当公共可访问的目录需要基本的HTTP身份验证时,其值为 $_SERVER['HTTP_AUTHORIZATION']
和/或 $_SERVER['REMOTE_USER']
(要么 $_SERVER['PHP_AUTH_USER']
一旦为服务器提供了有效的用户名/密码组合,PHP将被设置并可访问。
例如,如果 http://www.example.com/members
需要基本身份验证,并且用户使用凭据成功进行身份验证 myusername
和 mypassword
通过手动输入 http://myusername:mypassword@www.example.com/members
进入他们的浏览器,价值 $_SERVER['HTTP_AUTHORIZATION']
会是这样的:
Basic bXl1c2VybmFtZTpteXBhc3N3b3Jk
......和...的价值 $_SERVER['REMOTE_USER']
只会是:
myusername
但是,如果在同一目录中不需要身份验证,但仍然使用其中的用户名/密码访问URL,则用户名/密码的值似乎不会在任何地方设置(将PHP 5.3.10作为CGI /运行Apache / 2.2.22上的FastCGI)。
从PHP内部(和/或 .htaccess
如有必要), 何时不需要身份验证,有没有办法检索手动将其添加到URL的访问者提供的用户名(和/或密码)的值?
TLDR;据我所知,信息永远不会发送到服务器,所以我声称这是不可能的。
如果你设置了http身份验证的方式,那么服务器会发送一个user / pass请求(如果尚未设置),然后浏览器会将编码后的信息添加到 Authorization
标头并将其与请求一起发送到服务器。
如RFC 2617中所述,描述基本和摘要认证机制对于基本认证,服务器发送 HTTP 401 Not Authorized
地位和 WWW-Authenticate
标题字段以请求此信息。 (RFC 2617,访问认证框架)
通过测试可以看出,如果从未在服务器上配置认证,则服务器将不会从浏览器请求认证信息,并且浏览器不会将用户/传递信息添加到请求中。 RFC并未强制要求浏览器(用户代理)不传递该信息,而是说
希望使用原始身份验证自身的用户代理
服务器 - 通常,但不一定,收到401后
(未经授权) - 可以通过包含Authorization标头字段来实现
与请求。
实际上,如果您观察发送的标头,您可以看到,如果服务器请求此信息,则使用编码形式发送 Authorization
RFC指定的标头。但是,如果您未使用任何身份验证,则您发送的请求似乎不包含任何形式的信息。我自己用IE,Firefox和Chrome浏览器证实了这一点。
如果你想自己测试一下你的设置,可以这样做,例如使用netcat,如下所示:
首先,在您的服务器上运行netcat:
nc -l 8888
然后从您的浏览器发出请求 http://testvalue:testvalue@yourdomain:8888/
结果,从netcat输出观察发送到服务器的所有信息,如下所示:
GET / HTTP/1.1
Host: yourdomain:8888
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:39.0) Gecko/20100101 Firefox/39.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
任何地方都没有关于用户或密码的信息。我声称除非服务器请求它,否则它不会存在。
据我所知,使用http(s):// user:pass@site.com在网址中添加用户和密码至少已被Internet Explorer禁用了好几年了。
https://support.microsoft.com/en-us/kb/834489
所以我不确定你想要达到的目标是否有用。我认为浏览器甚至不再通过该部分网址了。