我需要禁止已设置的会话cookie标头,但我找不到任何方法来执行此操作。
<击>为什么?
我需要制作一个由PHP脚本发送的图像,最终用户可以缓存;此图像用于跟踪接收方是否已阅读新闻通讯,因此如果请求图像,我知道已阅读新闻通讯。我只需要知道通讯第一次打开时,后续请求可以被忽略。问题是,即使我正确设置Expire和Cache-Control标头,每次用户打开简报时都会请求图像 - 只有用于跟踪的图像 - 主要是因为它没有被用户缓存。我使用这个tool来理解为什么URL不可缓存,并且因为发送了cookie而说它。
我想避免的是用户看到跟踪图像加载延迟。
所以我在我的网站初始化函数中有一个session_start()
,我不想删除,因为网站很大而且复杂,并且做了一些彻底的改变,比如只在需要的时候启动会话(其中一个)我设想的解决方案是不可取的。调用session_start()
会将Set-Cookie:
标头设置为PHPSESSID
Cookie,我需要将其删除。从php.net上的header()
页面读取我尝试使用像这样的空值设置它
header('Set-Cookie:');
header('Set-Cookie:', true);
header('Set-Cookie: ');
header('Set-Cookie: ', true);
在调用session_write_close()
之前和之后,但我得到的只是用户收到Set-Cookie:
标头,没有任何值,完全与header
函数参数中写的一样。 / p>
我必须说我还在使用PHP 5.2,所以我不能使用手册中的header_remove()
函数和lighttpd 1.4.24。
编辑:所以,我用来检查标题的工具似乎不太好。我查看了curl --head
的标题,并看到了下面的标题。
HTTP/1.1 200 OK
X-Powered-By: PHP/5.2.9
Set-Cookie: PHPSESSID=qn3ms55nvst2717e7b73qqu445; path=/
Last-Modified: Sun, 29 Mar 2009 21:53:36 GMT
ETag: "cb1dffff8c10db7b0a88794b1453cab8"
Expires: Sun, 20 Dec 2009 23:28:07 GMT
Cache-Control: private, max-age=2592000
Pragma: no-cache
Content-Type: image/png
Content-Length: 1322
Date: Fri, 20 Nov 2009 23:28:07 GMT
Server: lighttpd/1.4.24
如您所见,设置为Pragma: no-cache
。我使用的工具说没有使用Pragma
标题,但这是错误的。我尝试设置Pragma: cache
,它使邮件客户端缓存图像。
我做了另一个发现,也许由于lighttpd而无法取消设置Set-Cookie
标头,因为我无法使用Pragma
删除header('Pragma:')
标头。期待PHP 5.3。使用Apache的用户是否可以确认上述header
调用会删除Pragma
标题?
感谢txyoji的启发性评论: - )
此时似乎这个问题只是为了确认lighttpd无法通过设置没有值的标头来删除标题。
答案 0 :(得分:2)
尝试header_remove('Set-Cookie');
答案 1 :(得分:1)
为了杀死会话 总而言之,喜欢将用户注销, 会话ID也必须取消设置。如果 一个cookie用于传播 会话ID(默认行为),然后 必须删除会话cookie。 setcookie()可以用于此。
此代码有效吗?
setcookie("PHPSESSID", 'foo', time()-3600); /* expired 1 hour ago */
另一种解决方案是通过PHP文件提供图像,因此无论何时获得请求,您都可以更新数据库并为订阅者表设置一个打开时事通讯的标记。更清洁的解决方案恕我直言。您可以使用以下代码嵌入图像:
<img src="http://www.example.com/tracker.php?idhash=1234234"/>
其中idhash可以是订阅者ID和简报ID的组合。
答案 2 :(得分:0)
您可以增加会话的长度,以便在用户关闭浏览器时它们不会过期吗?在用户第一次加载图像时设置会话变量。这样,多次请求图像无关紧要。您只在未设置变量时更新数据库。
答案 3 :(得分:0)
您是否确定因会话cookie而请求了图片,而不仅仅是因为某些原因的电子邮件客户端没有进行任何缓存?
答案 4 :(得分:0)
如果使用session_name()有条件地更改会话cookie名称,具体取决于所请求的URL?
答案 5 :(得分:0)
试试这个:
header('Pragma:',true);
答案 6 :(得分:0)
PHP首次启动会话时不会发送设置Cookie标头。
如果session_cache_limiter()在会话启动时设置为“private”,PHP将设置pragma:nocache标头。如果您想要缓存,请致电
session_cache_limiter('public')
在调用session_start()之前。它必须在session_start()之前,这意味着如果你的php环境设置为自动启动会话,那么你必须在你的php.ini中设置session.cache_limiter = public。
如果PHP正在发送set cookie标头,那么就会发生以下四种情况之一。
1)会话正在多次启动。
没有来源 - 但是单行PHP程序会为您验证这一点。
session_start(); // <-- cookie is not sent
session_start(); // <-- does not count as a second start, nothing happens
session_start(); // <-- cookie is not sent
session_write_close(); // session_destroy() counts as well
session_start(); // <-- cookie is sent, since the session has been closed
检查您的请求和响应标头。如果响应中的phpsessid值与请求中的值相同,那么这可能就是正在发生的事情。
2)会话在启动后正在重新生成
PHP.NET - session_regenerate_id() - 4.3.3的更改日志
session_regenerate_id();
检查您的请求和响应标头。如果它们不同,那么这可能就是正在发生的事情。
3)在会话开始之前设置了sessionid
PHP.NET - session_id - 参数
session_id('whatever');
session_start();
这个很容易检查。如果你在代码中的任何地方看到对session_id的调用,那么它是:在调用session_start之前,并且是问题;或者是在调用session_start之后,它什么也没做。
4)正在调用setcookie(session_name(),...,...),在某处手动设置cookie
无来源
setcookie(session_name(),'a session id')
// or setcookie('PHPSESSID', 'a session id')
这个也很容易检查。寻找setcookie的任何实例。
答案 7 :(得分:0)
your question isnt really clear, but if you want to remove the PHP session cookie completely (on log-out for example), you can use
$params = session_get_cookie_params();
setcookie(session_name(), '', 0, $params['path'], $params['domain'], $params['secure'], isset($params['httponly']));