如何抑制/删除PHP会话cookie

时间:2009-11-20 21:34:46

标签: php session cookies header http-headers

我需要禁止已设置的会话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无法通过设置没有值的标头来删除标题。

8 个答案:

答案 0 :(得分:2)

尝试header_remove('Set-Cookie');

答案 1 :(得分:1)

来自session_destroy

  

为了杀死会话   总而言之,喜欢将用户注销,   会话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']));