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