$ _SERVER和apache_request_headers()在请求之间持久存在?

时间:2013-01-20 16:39:56

标签: php apache http-headers

我正在为php中的Web服务进行身份验证。当用户验证会话时生成。最终此会话到期,用户需要再次进行身份验证。身份验证信息在http标头中发送。

但似乎有时变量$ _SERVER(或apache_request_headers())会返回当前请求中客户端未发送的某些标头(它们是在先前的请求中发送的)。例如,有时我得到变量$ _SERVER ['HTTP_RESPONSE'],其中包含先前请求中的信息。

$ _SERVER或apache_request_headers()在请求之间'持久'是否正常?

2 个答案:

答案 0 :(得分:1)

这取决于您是否使用浏览器访问脚本。

你的'持久'标题可能是由于浏览器缓存,但即便如此,我也不完全确定发生了什么。我尝试使用Fiddler运行一些测试,但无法复制问题。

也许尝试清除缓存,因为以前版本的脚本可能存储了不同的标头。

但是,我肯定会避免在标头中发送身份验证参数。除非您使用HTTPS,否则它们可能会被嗅闻和窃取。你为什么使用标题?

答案 1 :(得分:0)

$_SERVER包含有关服务器的信息,它不一定包含任何请求/响应信息,它在服务器生命周期内是持久的(例如,SERVER_NAME将持续存在,但与REQUEST无关) / RESPONSE)

apache_request_headers()包含已发送的标头数组,这些标头可能包含也可能不包含任何Cookie和会话信息 - 它们依赖于您用来访问服务器的客户端。

唯一可以在请求中保留的东西是$ _SESSION,因为每次访问$ _SESSION超全局时,它都会获取保存在文件系统上的会话信息(基本的PHP实现),一些框架会在会话中保留数据库(例如Yii)。

我假设您要创建基于请求标头的身份验证,因此您需要实际执行的操作是解析request_headers,将其与合法用户凭据进行匹配,并简单地open_session();并在会话中添加一个值,该值将用户标记为已经过身份验证,任何后续检查都将针对$ _SESSION超全局或针对其他一些会话实现进行。