我正在使用PHP7使用我最喜欢的控制方法启动会话:URL路径。这曾经[我正在做的方式]工作,但在PHP7中不起作用。让我们从一个完全正常的hello world示例开始。
<?php
session_start();
if(TRUE){
$_SESSION['test'] = 'Hello World!';
}
print_r($_SESSION);
echo "<P>".session_id();
首先使用TRUE运行它,这个宝宝完美无缺。设置为FALSE,你得到你期望的。一遍又一遍地运行它,你得到相同的预期结果。我甚至可以访问会话文件,看看变量已保存。
现在,我是使用域路径控制代码的粉丝。 E.G.,example.com / action1 / action2。 Action1在我的.htaccess文件中被标识为PHP类型文件,我的doc_root有一个符号链接,action1 - &gt; index.php文件。请注意,这种方法在各方面都可以正常工作,但只有一个......当你将这些路径添加到URI时,会话就会停止读取变量。
你能帮我理解为什么吗?是的,这个问题的明显解决方案是“我这样做会很疼,我该怎么办?”是“不要那样做”。但就像我说的那样,我是粉丝。坦率地说,这应该有效。唯一的cookie是正确的。session_id()
报告我正在查看相同的会话ID和文件。填充数据的完全相同的会话ID。删除/ action1 / action2组件,$ _SESSION变量再次显示,就像我们期望的那样。
有谁知道为什么会这样?添加禁用会话的路径是什么意思?为什么PHP甚至会关心,只要它具有预期的会话ID?我甚至尝试file_get_contents()
会话文件,因此我可以session_decode()
内容。没有操作路径,我可以读取和处理文件。有了动作路径(请滚鼓......)我甚至无法读取文件。这就好像发生了某种所有权变更,但我的文件和目录权限是敞开的。有什么想法吗?
.htaccess:
RewriteEngine On
RewriteBase /
AddHandler application/x-httpd-php70 .php
<Files action1>
SetHandler application/x-httpd-php
</Files>
编辑:如果你想自己测试一下。将第一个文件保存到test.php
,然后更新.htaccess文件,如图所示。最后,ln -s test.php action1
。运行domain.com/test.php
向自己证明会话正在运行。然后运行domain.com/action1
并观察变量消失。
答案 0 :(得分:1)
您使用的是两个不同的PHP版本:
所有application/x-httpd-php70
文件的默认值.php
处理程序。
另一方面,文件的application/x-httpd-php
处理程序以action1
开头。
当您添加该路径时,apache使用可能阻止或使用其他会话存储的其他PHP配置。我不能具体说,因为我从来没有创建过这样的设置,但很可能你只是忘了为文件使用相同的动作处理程序。
这是Apache中的动作处理程序配置。请参阅文档https://httpd.apache.org/docs/2.4/handler.html,以便您可以更好地了解正在发生的事情(也许还有第二个PHP来自哪里,您应该能够在Apache配置中找到它。)
答案 1 :(得分:0)
事实证明,@ hakre是在正确的道路上,但改变并没有解决问题。问题是Plesk直接指定要通过php_fpm处理的* .php文件。在虚拟主机Apache配置文件中,我们有......
<Files ~ (\.php$)>
SetHandler proxy:unix:///var/www/vhosts/system/wwphelps.com/php-fpm.sock|fcgi://127.0.0.1:9000
</Files>
这就是Plesk通过域名专门将一个版本的PHP连接到另一个版本的方式。任何不属于这条规则的东西都是由Apache的全局规则解释的,对我来说,这些规则正在考虑不同的PHP安装。 (为什么Plesk没有指向他们自己的PHP安装的全局覆盖是一个奇迹,但我怀疑这是他们以前从未遇到的错误。)所以,从逻辑上讲,我们&#39 ; d只需添加我们想要处理的每个文件而不使用.php后缀...
<Files action1>
SetHandler proxy:unix:///var/www/vhosts/system/wwphelps.com/php-fpm.sock|fcgi://127.0.0.1:9000
</Files>
你确实需要这样做,但对我而言,它并没有像宣传的那样工作。我的网页只是简单地说“拒绝访问”#34;我的错误文件指向FPM的security.limit_extensions参数。换句话说,尽管具体标识了我想要使用的没有后缀的文件,FPM仍然拒绝它。这是我懒惰的地方。我将变量重置为空。在Plesk中,通过在域的conf目录中创建或修改php.ini文件并添加(包括标题,如果它还没有在那里)来完成...
[php-fpm-pool-settings]
security.limit_extensions =
重启Apache,鲍勃是你的叔叔。
根据Google搜索的快速搜索,从Plesk内部直接修改FPM参数的能力仍有争议。
现在,这需要付出代价。从FPM套接字的角度来看,突然之间你的任何文件都是网络根源&#34;可以&#34;作为PHP文件执行,包括客户上传的图像,你盲目地放入[ROOT] / images目录。除非您已经告诉过Apache,否则任何旧文件都不会被解释为PHP文件,因此您可以部分保存。但是,如果您通过网站上传的所有文件都经过彻底审查以确保它们是他们声称的内容并且(b)要么保存在网络根目录之外,要么保存在数据库中,那么您将受到更好的保护。没有人可以&#34;执行&#34;直接引用它们。
最后,应该有一种方法可以在配置文件中覆盖那些我想故意违反security.limit_extensions的文件。不幸的是,FPM和Apache似乎没有相互通信,否则使用该块将完全覆盖security.limit_extensions。尽管如此,我知道有一种方法可以做到这一点。我很想知道,但我有一个有效的解决方案,所以我重新开始工作。