既然您提到了 PHP,我将包含 PHP 手册中的信息。
我相信其他语言也有类似的行为。
在服务器中,会话是特定于cookie的。
从PHP手册 http://php.net/manual/en/session.examples.basic.php:
会话 ID 通常通过会话 cookie 发送到浏览器,并且该 ID 用于检索现有会话数据。如果缺少 ID 或会话 cookie,PHP 就会知道创建新会话并生成新会话 ID。
在用户代理(客户端,通常是浏览器)中,cookie 特定于域和路径。
从RFC6265 https://www.rfc-editor.org/rfc/rfc6265,第 4.1.2.3 节:
Domain 属性指定 cookie 将发送到的主机。例如,如果 Domain 属性的值为“example.com”,则用户代理在向 example.com 发出 HTTP 请求时将在 Cookie 标头中包含 cookie,www.example.com http://www.example.com, and www.corp.example.com http://www.corp.example.com.
第 4.1.2.4 节:
仅当 request-uri 的路径部分与 cookie 的 Path 属性匹配(或其子目录)时,用户代理才会在 HTTP 请求中包含 cookie,其中 %x2F(“/”)字符被解释为目录分隔符。
因此,例如,如果您在域名和 IP 地址之间来回移动,example.com
and 12.34.56.78
,
服务器创建的会话 cookieexample.com
不会被用户代理发回
如果您稍后提出请求12.34.56.78
,即使两者是同一服务器。
对于后面的请求,由于服务器看不到会话 cookie,因此会创建一个新会话并发送一个新 cookie。
这就是为什么同时使用域名和 IP 地址将使用单独的会话。
如果您需要在同时使用域名和 IP 地址时使用相同的会话,则必须在请求之间保留会话 ID。
一种常见的方法是在查询字符串中传递会话 ID。
事实上,PHP 会话管理也可以配置为使用这种方法,但我从来不需要使用它,所以我无法告诉你这是如何进行的。
继续我的示例,您可以将其用于后续请求:
http://12.34.56.78/?sessionId=abcdef0123456789
Where abcdef0123456789
是一个会话 ID 示例。
在PHP代码中,调用前设置会话IDsession_start()
。
示例代码:
if(isset($_GET['sessionId']))
session_id($_GET['sessionId']);
@session_start();
当然,你不必使用sessionId
。
您可以使用foobar
或其他任何东西。
您还可以每天甚至每小时更改它以防止会话劫持。
Update: To use foobar
,将PHP代码修改为:
if(isset($_GET['foobar']))
session_id($_GET['foobar']);
@session_start();
使用该代码,您可以像这样传递会话 ID:
http://12.34.56.78/?foobar=abcdef0123456789
如果你想使用xyz
,PHP 代码将是:
if(isset($_GET['xyz']))
session_id($_GET['xyz']);
@session_start();
您可以像这样传递会话 ID:
http://12.34.56.78/?xyz=abcdef0123456789
关键是,这完全取决于你。