【问题标题】:How to configure session.save_path inside php.ini for webpack4 based website?如何在基于 webpack 4 的网站的 php.ini 中配置 session.save_path?
【发布时间】:2019-08-23 09:37:11
【问题描述】:

我已经在这里收到了关于我的整体问题的非常有用的信息: session_start() causes error: No such file or directory (fresh, portable XAMPP)

我的登录功能需要会话变量,并且我已经找到了我的 php.ini 并配置了路径 session.save_path = "D:\foundationtests\src\assets\Session"

因此它也位于我的服务器 DocumentRoot 之外。

到目前为止,我的网站的行为并没有太大的变化,并且我已经通过foundation watch(使用基于webpack4、Babel7和Gulp的ZURB Foundation 6.4 Framework)重建了项目,并且Session文件夹出现在dist中文件夹。

在我设置会话变量的php文件中,似乎可以访问,因为我可以回显它,我给你一段简化的代码:

  session_start();

  $_SESSION["loggedUserID"] = 9;

  echo $_SESSION["loggedUserID"];

但是,执行此脚本后,当我想从另一个脚本访问 Session 变量时,似乎数据丢失了:

session_start();

echo $_SESSION["loggedUserID"];

我在浏览器控制台中收到以下错误消息。

<br />
<b>Notice</b>:  Undefined index: loggedUserID in <b>D:\foundationtests\src\assets\php\globallyUsedFunctions\retrieveLoggedUserID.php</b> on line <b>4</b><br />

另外,我在会话文件夹中找不到任何由 php 创建的文件。

但是,例如,我不确定我是否正确配置了路径。毕竟,它是执行构建项目的 dist 文件夹。

但由于我对模块化网站项目和 php/apache 服务器的配置都很陌生,我不知道这可能是什么原因...^^

我在没有管理员权限的 Windows 10 机器上从 XAMPP 运行我的服务器。但是,至少我作为用户可以在我的服务器和我的项目所在的 D 分区上创建新文件和内容。

编辑:

重新启动我的网络服务器后,会话文件在我的会话文件夹中创建。但是,当我在 phpFile1 上设置 $_SESSION["indexname"] 时,然后单击一个调用 phpFile2 的按钮,该按钮首先执行 session_start();然后尝试访问 $_SESSION["indexname"] 中的值,我从上面得到了错误。 由 phpFile1 创建的会话文件仍然存在,它还包含数据,但随后 phpFile2 创建了另一个会话文件,这个文件是空的,所以我的第一个猜测是服务器访问第二个空文件,当然会发现没有什么。但是我能做些什么来改变这一点。

当我从 php 文件中调用 phpinfo() 并将其回显到我尝试 console.log() 的前端时,我得到以下响应:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"><head>
<style type="text/css">
body {background-color: #fff; color: #222; font-family: sans-serif;}
pre {margin: 0; font-family: monospace;}
a:link {color: #009; text-decoration: none; background-color: #fff;}
a:hover {text-decoration: underline;}
table {border-collapse: collapse; border: 0; width: 934px; box-shadow: 1px 2px 3px #ccc;}
.center {text-align: center;}
.center table {margin: 1em auto; text-align: left;}
.center th {text-align: center !important;}
td, th {border: 1px solid #666; font-size: 75%; vertical-align: baseline; padding: 4px 5px;}
h1 {font-size: 150%;}
h2 {font-size: 125%;}
.p {text-align: left;}
.e {background-color: #ccf; width: 300px; font-weight: bold;}
.h {background-color: #99c; font-weight: bold;}
.v {background-color: #ddd; max-width: 300px; overflow-x: auto; word-wrap: break-word;}
.v i {color: #999;}
img {float: right; bo…

我不知道为什么会这样,对我来说似乎是错误的,因为它与 php 关系不大,但我也不知道如何更改它。

编辑: session_get_cookie_params()var_dump() 根据失礼的要求。

array(6) {
  ["lifetime"]=>
  int(3600)
  ["path"]=>
  string(1) "/"
  ["domain"]=>
  string(14) "localhost:8000"
  ["secure"]=>
  bool(false)
  ["httponly"]=>
  bool(false)
  ["samesite"]=>
  string(0) ""
}

【问题讨论】:

  • 您是否在进行配置更改后重新启动了 Web 服务器?当您致电phpinfo 时,它是否会在会话部分显示您期望的值?您是否检查了会话 ID 是否在这两个页面之间正确传递,或者您每次都得到一个新的?
  • @misorude 是的,现在我重新启动了网络服务器,会话文件出现了。他们还携带数据(我现在将其编辑到我的帖子中)。我不确定“在这两个页面之间传递会话 ID”是什么意思。我在 phpFile1 上的 $_session["name"] 索引中插入一个值,然后单击一个调用 phpFile2 的按钮,然后我尝试通过 $_session["name"] 指示它来访问该值,但它抛出了上述内容错误。是的,在 phpFile1 和 phpFile2 上,我都使用 session_start() 开始了一个会话。每次,我的会话文件夹中都会生成一个新的会话文件,但第二个是空的
  • 但是我的意思是你应该首先检查是什么使会话基本上工作在这里正常工作:客户端需要将原始会话 ID 传递回服务器,以便服务器可以将该特定数据集再次与该特定客户端相关联。如果这没有正确发生,PHP 会启动一个 new 会话 - 所以基本上您在这里遇到的情况是:“每次,我的会话文件夹中都会生成一个新的会话文件”
  • 我首先检查会话 cookie 设置的参数;听起来可能是由于 webpack,URL 路径可能已被更改,因此客户端不再接受此 cookie 作为实际路径,或类似的东西。
  • @misorude 谢谢,我会检查一下,同时我还添加了一些新信息,请参阅我的编辑。

标签: php apache session webpack zurb-foundation


【解决方案1】:

所以我终于做到了,这就是我必须做的事情! 我在最新的免安装 XAMPP 和 ZURB Foundation 6.4 ZURB 模板项目中工作。

要通过 AJAX 建立跨域会话,必须进行以下配置:

通过调用的 php 脚本设置标题,如下所示:

Header("Access-Control-Max-Age: 360");
Header("Access-Control-Allow-Credentials: true");
Header("Access-Control-Allow-Methods: *");
Header("Access-Control-Allow-Headers: Origin");
Header("Access-Control-Expose-Headers: Access-Control-Allow-Origin");
Header("Access-Control-Allow-Origin: "http://localhost:PORT FROM WHICH AJAX CALL IS  PERFORMED");

您也可以在您的目录部分的 httpd.conf 中执行此操作,如下所示:

标头集 Access-Control-Allow-Origin "http://localhost:8000"

等等……

然后,您需要进入 php.ini 并为您的会话配置以下内容: session.save_path = "D:\Path\To\src\Session"

然后,假设您将所有其他设置保留为默认设置,您需要像这样配置以下 cookie 参数:

session.cookie_lifetime = 3600
session.cookie_domain = localhost 

(如果您使用 localhost 域)

然后,如果您使用 AJAX,则必须手动设置执行调用的对象以提交凭据,否则浏览器不会跨域发送 cookie,如下所示:

   $.ajax({
      type:"POST",
      url: 'http://localhost:8099/test3.php',
      xhrFields: {
     withCredentials: true
     }
  }).then((response) => {
    console.log(response)
  })
}

xhrFields - withCredentials 是这里非常重要的部分!如果未设置为 true,则不会跨域传输 cookie。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-11
    • 1970-01-01
    • 2010-09-15
    • 1970-01-01
    • 2017-12-30
    • 2017-04-25
    • 2019-01-18
    • 2018-08-09
    相关资源
    最近更新 更多