通过非 PHP 扩展访问时,PHP 会话不起作用

Posted

技术标签:

【中文标题】通过非 PHP 扩展访问时,PHP 会话不起作用【英文标题】:PHP Session does not work when accesing via non-PHP extensions 【发布时间】:2012-12-27 09:19:47 【问题描述】:

我在从 html 页面访问 php SESSION 数据时遇到了一个奇怪的问题。我有一个基本的 login.php,我将其重定向到“page1.html”。现在我已经这样配置了 .htaccess:

AddType application/x-httpd-php5 .html .htm

另外,我知道我的 php 代码可以在任何给定的 HTML 页面上运行。

但是,如果我说:

session_start();

....

if(!isset($_SESSION['username']))
    header ("Location: http://blahblahblah/Login.html");

在 page1.html 的正文中,if 语句总是触发(实际上是 var_dump($_SESSION) yields "array(0) ")。

但是,如果我采用相同的代码,将其放在“page1.php”中,一切都会按预期工作(以及 var_dump($_SESSION) gives proper values).

那么,是否不能像将扩展名重命名为 '.php' 一样从 HTML 页面访问 $_SESSION?或者我在这里做错了什么?我宁愿将我的大部分页面保留为'.html',而不是'.php,',因为返回并更改所有文件扩展名等会带来不便。

非常感谢,

【问题讨论】:

在尝试访问 $_SESSION 之前,您是否致电 session_start() 你试过session_start() in page1.html 吗? 您不应保留所有 PHPHTML 扩展名。当您可以轻松隐藏所有扩展或只是为 php 脚本添加另一个重写规则时,为什么需要它!? @alfasin 这是错误的。他说他强迫 Apache 解释带有html 扩展名的php 脚本 它甚至可以解释任何带有随机扩展名的 PHP 脚本,例如 .pl.rb.py.jsp,甚至是 .do 【参考方案1】:

根据您的描述,PHP 运行正常(因为触发了 if 语句)。

需要检查的一些事项:

是否在 page1.html 中调用了 session_start()?必须调用它来检索会话数据并填充 $_SESSION 超级全局。 在发送标头之前是否调用了session_start()?在发送任何 HTML 或空格之前检查会话是否已启动,否则会话 cookie 将不会与标头一起发送。 Lo​​gin.html 和 page1.html 是否在同一个域和同一个子域中?如果会话 cookie 不可用,$_SESSION 可能为空。如果您尝试跨域使用会话,则可能会发生这种情况。 是否有会话 cookie 并且正在发送?在导航到 page1.html 时,使用 Firebog/Inspector 等检查以确保会话 cookie 存在,并且它正在与页面请求一起传递。 $_SESSION 变量是如何设置的? page1.php 起作用可能只是巧合,因为当您第一次尝试访问 page1.html 时,$_SESSION 变量可能没有正确设置 Apache 是否有权写入 php.ini 中声明的 session.save_pathsession.save_path 是有效路径吗?

【讨论】:

第 1 点和第 2 点 - 是的。这两个都很好。第三点——嗯。所以我一直在用 chrome 工作(无论好坏),我打开了 firefox 来检查它,而不是像 chrome 那样加载 page1.html(并进入!isset)firefox 给出了一个“警告:未知:失败写入会话数据(文件)。请在第 0 行的 Unknown 中验证 session.save_path 的当前设置是否正确(/tmp) 有趣,似乎没有设置会话 cookie,因为 Apache 无法写入 /tmp(默认会话路径)。尝试将会话路径设置在文档根目录中。 session_save_path(realpath(dirname($_SERVER['DOCUMENT_ROOT']) . '/session')); 您可能需要创建此目录,并且需要在您使用会话的每个页面上调用 session_save_path 我不能说我在这方面有很多经验,如果我吸收缓慢,很抱歉。所以我会把那条线放在我将 session_start() 放在 page1.html 之类的文件中的位置? 是的,您可以在 session_start 之前包含该行(它应该在文件的最顶部,在任何 HTML 或空白之前)。或者,您可以使用 php_value session.save_path ./sessions 在您的 .htaccess 文件中设置它 嗯,试过了,运气不好。我需要继续这个项目,所以在这一点上,我想我会花时间将相关的文件扩展名切换为 .php,然后这不是问题......不过谢谢......

以上是关于通过非 PHP 扩展访问时,PHP 会话不起作用的主要内容,如果未能解决你的问题,请参考以下文章

PHP在登录/退出时重新生成会话ID不起作用

PHP会话根本不起作用

PHP未设置会话不起作用

会话和 php 重定向不起作用

PhP 5.4 中的 PhP 上传进度不起作用。未设置会话变量

在 XMLHttpRequest() 之后 PHP 定义不起作用