在主机从PHP 4.x升级到PHP 5.4.1之后,我的一个朋友在通过XMLHttpRequest(他使用jQuery)来访问$ _SESSION变量时遇到了很大的问题。
我希望他的代码的以下片段说明了他的问题:
的index.php
<?PHP
session_start ();
$_SESSION['chatfenster'] = array();
$_SESSION['user'] = 1;
?>
<!-- HTML Markup -->
<script type="text/javascript" src="../scripts/jquery/js/jquery-1.8.2.min.js"></script>
<script type="text/javascript">
$(document).ready(function () {
setInterval(function() {
$.post("http://www.his-domain.at/ticker_tracker.php", function( feedback ) { alert(feedback); } )
},
10000);
});
ticker_tracker.php:
<?PHP
session_start();
var_dump($_SESSION);
?>
当他浏览index.php然后手动浏览ticker_tracker.php时,$ _SESSION变量正确地被var_dumped,但是如果通过$ .post()调用php文件,$ _SESSION变量都是空的,从而发出警报只是“array {}”。
Hosters支持说一切都很好,他们根本没有改变任何设置,但我注意到Chrome由于跨域请求而阻止了XMLHttpRequest,给出了错误消息(也只是在升级到PHP 5.4.1之后出现) :
XMLHttpRequest cannot load. No 'Access-Control-Allow-Origin' header is present.
在每个php的最顶层添加Access-Control-Allow-Origin标头解决了这个错误,但主要问题(空$ _SESSION变量)仍然存在。
任何建议表示赞赏。提前谢谢!
答案 0 :(得分:0)
如果您收到access-control-allow-origin错误(可以通过添加标题解决),那么您正在执行跨域请求。这就是为什么你有不同的会话内容:他们是不同的会议!
这可以是从一个机器(域)到另一个(www.one.com到www.two.com),这可以是从一个子域到另一个(www.one.com vs one.com)或这可能是一个不同的服务(例如http vs https,这些可能由不同的机器或进程提供)。
所有这些都有一个共同点:你有一个似乎要去另一个地方的请求(因此允许来源)。而另一个地方有不同的会议,因为它们不共享。
检查您访问控制的原因:请求不会转到同一个地方。所以&#39;修复&#39;它带有标题只是对原点的修复:删除该修复&#39;,并使请求不需要它。然后你回到相同的服务器/进程/无论什么,并将拥有相同的会话。