【问题标题】:PHP Session does not work when accesing via non-PHP extensions通过非 PHP 扩展访问时,PHP 会话不起作用
【发布时间】: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

标签: php html .htaccess session session-variables


【解决方案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_path
  • session.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,然后这不是问题......不过谢谢......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-26
  • 2012-11-16
  • 2012-01-22
  • 2015-02-19
  • 2019-02-26
  • 2014-07-09
相关资源
最近更新 更多