PHP $ _SESSION值在www上有所不同

时间:2012-06-06 10:57:45

标签: php

我有一个网站。人们可以在这里登录

sub.domain.com

如果他们在这里登录,会话将完成其工作,用户将登录。在sub.domain.com的任何页面上,会返回会话值,以便它可以正常工作。

但也可以从www.sub.domain.com与网站联系。当用户在sub.domain.com上登录时,会话值在www.sub.domain.com处为空。 我的意思是如果用户登录sub.domain.com, 当他导航到www.sub.domain.com时,网站会说“请登录”,但是用户已经登录了没有“www”的网站。 希望一切都清楚,谢谢。

4 个答案:

答案 0 :(得分:3)

在主要脚本的顶部添加在session_start之前

 ini_set('session.cookie_domain', '.domain.com' );

如果您在启用了suhosin的情况下运行PHP,请尝试禁用此设置

  ini_set("suhosin.session.cryptdocroot", "Off");
  ini_set("suhosin.cookie.cryptdocroot", "Off");

来源PHP bug tracker

感谢@RandomDave

  

您可以从$ _SERVER ['HTTP_HOST']动态确定域名,这样您就不必对域名进行硬编码

  ini_set('session.cookie_domain', strtolower(substr($_SERVER['HTTP_HOST'], 0, 4)) == 'www.' ? substr($_SERVER['HTTP_HOST'], 3) : '.'.$_SERVER['HTTP_HOST'] );

答案 1 :(得分:0)

为您的会话设置cookie_domain。

ini_set('session.cookie_domain', '.domain.com' );

或者在php.ini

中更改此设置

答案 2 :(得分:0)

如果您正在浏览将要设置cookie的www.,则PHP会话使用cookie来存储会话标识符。

您可以通过设置以点为前缀的会话cookie域来缓解此问题,该点基本上用作*.domain.com的{​​{1}}通配符。您可以使用.domain.com执行此操作:

session_set_cookie_params

更安全的示例将使用session_set_cookie_params(0, '/', '.domain.com'); 并重新传回其他值。更好的是,您可以修改服务器上的session_get_cookie_params以将php.ini值设置为{{ 1}}(你也可以使用session.cookie_domain)。

答案 3 :(得分:0)

您还可以在网站的根目录添加.htaccess,例如

RewriteEngine on
RewriteBase /
RewriteCond %{HTTP_HOST} ^sub\.domain\.com
RewriteRule ^(.*)$ http://www.sub.domain.com$1 [R=permanent,L]