通过非 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
吗?
您不应保留所有 PHP
和 HTML
扩展名。当您可以轻松隐藏所有扩展或只是为 php 脚本添加另一个重写规则时,为什么需要它!?
@alfasin 这是错误的。他说他强迫 Apache 解释带有html
扩展名的php
脚本
它甚至可以解释任何带有随机扩展名的 PHP 脚本,例如 .pl
、.rb
、.py
、.jsp
,甚至是 .do
【参考方案1】:
根据您的描述,PHP 运行正常(因为触发了 if 语句)。
需要检查的一些事项:
是否在 page1.html 中调用了session_start()
?必须调用它来检索会话数据并填充 $_SESSION
超级全局。
在发送标头之前是否调用了session_start()
?在发送任何 HTML 或空格之前检查会话是否已启动,否则会话 cookie 将不会与标头一起发送。
Login.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,然后这不是问题......不过谢谢......
以上是关于通过非 PHP 扩展访问时,PHP 会话不起作用的主要内容,如果未能解决你的问题,请参考以下文章