如何解决在PHP中重定向后丢失会话的问题?
最近,我遇到了一个非常常见的问题,即在重定向后丢失会话。在搜索该网站后,我仍然找不到任何解决方案(尽管这是最接近的解决方案)。
更新资料
我找到了答案,我想将它发布在这里,以帮助遇到同样问题的任何人。
如何解决在PHP中重定向后丢失会话的问题?
最近,我遇到了一个非常常见的问题,即在重定向后丢失会话。在搜索该网站后,我仍然找不到任何解决方案(尽管这是最接近的解决方案)。
更新资料
我找到了答案,我想将它发布在这里,以帮助遇到同样问题的任何人。
Answers:
首先,执行以下常规检查:
session_start();
在调用任何会话之前已被调用。因此,一个安全的选择就是将其放在页面的开头,即在开始<?php
声明之后立即放在其他任何地方。另外,请确保在打开<?php
声明之前没有空格/制表符。header
重定向,使用结束当前的脚本exit();
(其他人也建议session_write_close();
,并session_regenerate_id(true)
,你可以尝试那些为好,但我会用exit();
)register_globals
已关闭,您可以在php.ini
文件上并使用进行检查phpinfo()
。有关如何关闭它的信息,请参考此。$_SESSION
超全局数组中的密钥不会在任何地方被覆盖www.yourdomain.com
到yourdomain.com
不会继续进行会话。.php
(确实发生了!)现在,这些是最常见的错误,但是如果他们没有解决问题,那么问题很可能出在您的托管公司身上。如果一切正常,localhost
但不能在您的远程/测试服务器上运行,则很可能是罪魁祸首。因此,请检查您的托管服务提供商的知识库(也可以尝试其论坛等)。对于FatCow和iPage之类的公司,它们要求您指定session_save_path
。像这样:
session_save_path('"your home directory path"/cgi-bin/tmp');
session_start();
(将“您的主目录路径”替换为您的实际主目录路径。这通常在控制面板内(或等效菜单中),但是您也可以test.php
在根目录上创建一个文件并输入:
<?php echo $_SERVER['SCRIPT_FILENAME']; ?>
“ test.php”之前的位是您的主目录路径。当然,请确保该文件夹实际上存在于您的根目录中。(某些程序在同步时不会上传空文件夹)
我有同样的问题。我工作了几个小时,这让我发疯。
就我而言,问题是由于仅在Chrome和Firefox中缺少favicon.ico而调用了404 。其他导航器工作正常。
这让我困扰了很长时间(这篇文章很棒!),但是对于仍然无法在页面重定向之间进行会话的其他人来说,我不得不进入php.ini文件并打开cookie。 :
session.use_cookies = 1
我以为没有cookie的会议就可以了...事实上,我知道它们应该...但是,这至少解决了我的问题,直到我了解了大局。
我有一个类似的问题,尽管我的情况略有不同。我在一台主机名为windows
IP地址为的机器上进行了本地开发192.168.56.2
。
我可以使用以下任一方式访问系统:
登录后,我的PHP代码将使用以下方式重定向:
header('http://windows/');
如果不是用于访问系统的先前域名windows
,则会话数据将丢失。我将代码更改为:
header('http://'.$_SERVER['HTTP_HOST'].'/');
现在,无论用户输入什么本地域名或IP地址,它都可以工作。
我希望这可能对某人有用。
我遇到了同样的问题。突然有些会话变量将无法持续到下一页。问题是(在php7.1中)标头位置不能包含WWW,例如https:// mysite。可以,https://www.mysite。将丢失该页面会话变量。并非全部,仅此页面。
www.mysite.com
被视为与blog.mysite.com
或完全不同的领域mysite.com
如果您正在使用session_set_cookie_params()
,则可能要检查是否将第四个参数传递$secure
为true
。如果是,则需要使用https访问该URL。
该$secure
PARAM是真正的手段会议仅仅是一个安全的请求中提供。这可能比在舞台或生产环境中对本地的影响更大。
提到它是因为我今天大部分时间都在尝试查找此问题,而这正是为我解决的问题。我只是被添加到该项目中,没有人提到它需要https。
因此,您既可以在本地使用https,也可以将$secure
参数设置为FALSE
,然后在本地使用http。只需在向上推送更改时将其设置为true即可。
根据您的本地服务器,您可能必须在服务器的中进行编辑DocumentRoot
,httpd-ssl.conf
以便为您的本地URL提供https。
另一个可能的原因:
那是我的服务器存储空间。我的服务器磁盘空间已满。因此,我在服务器中删除了一些文件和文件夹并进行了尝试。
它的工作!
我将会话保存在AWS Dynamo DB中,但仍希望服务器中有一些空间来处理会话。不知道为什么!
如果您正在使用Laravel并遇到此问题,则需要在重定向之前保存会话数据。
session()->save();
// Redirect the user to the authorization URL.
header('Location: ' . $authorizationUrl);
exit;
我也遇到了相同的问题,即重定向无法正常工作,并尝试了所有可以找到的解决方案,我的标头重定向已以某种形式使用。
我通过将标头重定向放置在其他php页面“ signin_action.php”中并通过将所需的变量参数传递给url参数,然后以“ signin_action.php”的形式重新分配它们来解决了该问题。
signin.php
if($stmt->num_rows>0) {
$_SESSION['username'] = $_POST['username'];
echo '<script>window.location.href = "http://'.$root.'/includes/functions/signin_action.php?username='.$_SESSION['username'].'";</script>';
error_reporting(E_ALL);
signin_action.php
<?php
require('../../config/init.php');
$_SESSION['username'] = $_GET['username'];
if ($_SESSION['username']) {
echo '<script>window.location.href = "http://'.$root.'/user/index.php";</script>';
exit();
} else {
echo 'Session not set';
}
?>
这不是一个很好的解决方法,但它确实有效。
在SO和其他博客上尝试了许多解决方案之后...对我有用的是在我的网站根目录中添加.htaccess。
RewriteEngine on
RewriteCond %{HTTP_HOST} ^yoursitename.com$
RewriteRule ^.*$ "http\:\/\/www\.yoursitename\.com" [R=301,L]
既然GDPR是一回事,访问此问题的人们可能会使用Cookie脚本。好吧,那个脚本对我造成了问题。显然,PHP使用了一个名为PHPSESSID
来跟踪会话。如果该脚本将其删除,则会丢失数据。
我使用了这个cookie脚本。它具有启用“基本” cookie的选项。我添加PHPSESSID
到列表中,脚本停止删除cookie,并且一切再次开始工作。
您可能可以启用某些PHP设置来避免使用PHPSESSID
,但是如果您的Cookie脚本是问题的原因,为什么不解决该问题。
今天,我在一个项目中遇到了这个问题,我不得不将此参数更改为false(或删除这些行,默认情况下是禁用的):
ini_set( 'session.cookie_secure', 1 );
发生这种情况是因为实际项目通过HTTP而不是仅通过https运行。在文档http://php.net/manual/en/session.security.ini.php中找到了更多信息
ini_set('session.save_path',realpath(dirname($_SERVER['DOCUMENT_ROOT']) . '/../session'));
session_start();
回复太晚了,但这对我有用
对我来说,这是权限错误,并解决了这个问题:
chown -R nginx:nginx / var / opt / remi / php73 / lib / php / session
我已经在PHP上测试了几个小时,最后一次测试是我创建了两个文件session1.php和session2.php。
session1.php:
session_start();
$_SESSION["user"] = 123;
header("Location: session2.php");
session2.php:
session_start();
print_r($_SESSION);
它正在打印一个空数组。
在这一点上,我认为这可能是服务器问题,实际上是。
希望这对某人有帮助。