2008-10-27 82 views
6

我正在编写PHP代码,我想使用POST自己传递会话标识。我不希望cookie存储会话,因为当用户离开POST周期时它会丢失。如何禁用PHP会话cookie?

PHP在可用时自动设置cookie。我知道可以通过在php.ini中将session.use_cookies设置为0来更改此行为。不幸的是,我无法访问该文件,也不想破坏在同一台服务器上运行的其他脚本的行为。

有没有一种方法来禁用或无效PHP脚本中的会话cookie?由于建议的解决方案不适合我,我在代码中的位置使用了$ _SESSION = array(),我发现会话应该失效。

回答

6

犯错它可以通过创建自己的.htaccess文件来覆盖你的主机的默认设置,这里有一个很好的教程,如果你还没有碰过,但 http://www.askapache.com/htaccess/apache-htaccess.html

或如果你太懒惰学习 刚在你的网站目录下建立一个“的.htaccess”文件(是的这就是文件名),并把下面的代码

SetEnv session.use_cookies='0'; 
+0

谢谢,不幸的是它不是Apache而是非常老的Netscape服务器.. – ypnos 2008-10-27 23:46:38

28

使用ini_set()

ini_set('session.use_cookies', '0'); 

或者在php.ini文件:

session.use_cookies = 0 
+0

谢谢。这应该可以解决我的问题,但不幸的是,现在PHP停止在脚本执行过程中(即使在html输出中间)。 – ypnos 2008-10-27 23:39:10

+0

我不会将此标记为正确的答案,因为它会使PHP停用。也许是一个PHP的错误? – ypnos 2008-10-27 23:52:48

+0

似乎没有任何反应。 htaccess解决方案为我工作。 – Heroselohim 2014-10-06 03:44:32

2

你也可以把在.htaccess设置,以便它适用于所有的脚本,否则你需要确保每个请求都调用代码。

例如,

php_value session.use_cookies 0

-2

这样做的方法是自己设置会话。

在所有其他文件都包含的中心包含文件中(您确实有其中一个,对吗?),您需要尽早做一些事情。

if(!array_key_exists('sessionid', $_POST)) { 
    // recreate the sessionid 
    $sessionid = md5(rand().' '.microtime()); // Or something 
} else { 
    $sessionid = $_POST['sessionid']; 

session_id($sessionid); 
session_start(); 

现在你要记住,一旦你开始的形式,你需要包括:

<input type='hidden' name='sessionid'><?= session_id() ?></input> 
2

如果你只需要能够在给定的时间,使用扎普会话session_destroy()。如果您想彻底结束会话,这里有一个片段复制/粘贴直出的文档:

// Initialize the session. 
// If you are using session_name("something"), don't forget it now! 
session_start(); 

// Unset all of the session variables. 
$_SESSION = array(); 

// If it's desired to kill the session, also delete the session cookie. 
// Note: This will destroy the session, and not just the session data! 
if (isset($_COOKIE[session_name()])) { 
    setcookie(session_name(), '', time()-42000, '/'); 
} 

// Finally, destroy the session. 
session_destroy(); 
1

我与PHP的成文规定,以摧毁一个会话瓦特/饼干麻烦。

// If it's desired to kill the session, also delete the session cookie. 
// Note: This will destroy the session, and not just the session data! 
if (ini_get("session.use_cookies")) { 
    $params = session_get_cookie_params(); 
    setcookie(session_name(), '', time() - 42000, 
     $params["path"], $params["domain"], 
     $params["secure"], $params["httponly"] 
    ); 
} 

这是导致我看到的cookie设置两次:

Set-Cookie: SESSION_NAME=deleted; expires=Sat, 08-Jan-2011 14:09:10 GMT; path=/; secure 
Set-Cookie: SESSION_NAME=1_4f09a3871d483; path=/ 

如PHP的意见记录在案,设置cookie值比空(“”)以外的东西摆脱的“删除“值,但第二个cookie集保留。

要摆脱的是,我不得不添加的代码上面的建议:

ini_set('session.use_cookies', '0'); 

我没有看过源处理会话,但我的猜测是的setcookie(...)是绕过会议模块,所以会议不知道我叫它。所以,在我设置一个已删除的cookie后,它将设置一个默认的cookie。

我是测试在Mac上:用了Suhosin贴片(CLI)PHP 5.3.6(建:2011年9月8日19点34分○○秒)