如何在 php.ini 中为基于 webpack4 的网站配置session.save_path?



我已经在这里收到了关于我的整体问题的非常有用的信息: session_start(( 导致错误:没有这样的文件或目录(新鲜的、可移植的 XAMPP(

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

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

到目前为止,我网站的行为没有太大变化,我已经通过 foundation watch(使用 ZURB foundation 6.4 框架基于 webpack4、Babel7 和 Gulp(重建了项目,会话文件夹出现在 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:foundationtestssrcassetsphpgloballyUsedFunctionsretrieveLoggedUserID.php</b> on line <b>4</b><br />

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

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

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

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

编辑:

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

当我从 php 文件调用 phpinfo(( 并将其回显到我尝试控制台.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) ""
}

所以我终于成功了,这是我必须做的! 我在最新的免安装 XAMPP 和 ZURB 基金会 6.4 ZURB 模板项目中工作。

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

通过调用的 php skripts 设置标头,如下所示:

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中执行此操作,如下所示:

标头集访问控制允许源"http://localhost:8000">

等等...

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

然后,假设您将其他所有内容保留为默认设置,您需要配置以下 cookie 参数,如下所示:

session.cookie_lifetime = 3600
session.cookie_domain = localhost 

(如果您使用本地主机域(

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

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

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

最新更新