0

我编写了一个使用 php 会话的 php Web 应用程序。当我在 Android 手机上尝试时,发现浏览器没有保留会话 cookie。我把它归结为这个超短的测试脚本:

<?php
session_start();
var_dump($_COOKIE);
?>

我在另一个浏览器中看到的预期行为是:在第一次调用时,我们看到:

array(0) { }

在第二次和随后的调用中,我们看到如下内容:

array(1) { ["PHPSESSID"]=> string(32) "8f08c514a5c15c36309e9a435ebcc8ec" } 

然而,在 Android 手机上,$_COOKIE数组保持为空,我总是得到第一个响应 ( array(0) { })。

我检查了设置并启用了 cookie。其他需要登录的网站(不是我写的)也可以正常工作。我还尝试清除所有 cookie 和缓存以防万一,但它没有改变任何东西。

编辑:为了澄清, session_start() 应该设置会话cookie,它实际上可以在台式电脑上使用Firefox。我还查看了 http 标头并发现

Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Set-Cookie: PHPSESSID=a270cbe1b57ba089c1eedacd8344e871; path=/ 

所以cookie肯定会被设置。当然,除非 PHP 在为 Android 浏览器提供服务时做一些不同的事情。

这是一个已知问题还是我遗漏了一些明显的问题?有没有解决方法?

4

1 回答 1

2

我意识到这是一个老问题,但我刚遇到同样的问题,在 StackOverflow 或 Google 上都找不到答案,所以我想我会分享我的解决方案。

如果您不使用子域,某些浏览器(主要是移动设备)会插入“www”。例如,如果您的站点是 example.com,浏览器会将其更改为 www.example.com。

如果您的会话是在 example.com 上设置的,那么会话 cookie 也是如此设置的,并且不会在 www.example.com 上被识别。我知道解决此问题的最简单方法是将以下行添加到您的 .htaccess 文件中:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.(.+)
RewriteCond %{HTTPS}s/%1 ^(on(s)|offs)/(.+)
RewriteRule ^ http%2://%3%{REQUEST_URI} [L,R=301]

希望这会帮助遇到同样问题的人:-)

于 2015-08-06T22:32:19.197 回答