You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.htaccess重写规则引发PHP Session异常问题求助

排查Session被意外销毁的问题

以下是针对你遇到的问题的具体排查方向:

1. 验证.htaccess重写规则的准确性

你的重写逻辑是"仅当文件/目录不存在时转发到page.php",但规则可能存在漏洞导致误触发。先确认你的规则是否完整覆盖了子目录的文件检查:

RewriteEngine On
# 检查请求的文件是否存在(包含子目录文件)
RewriteCond %{REQUEST_FILENAME} !-f
# 检查请求的目录是否存在
RewriteCond %{REQUEST_FILENAME} !-d
# 仅当上述条件都满足时,转发到page.php
RewriteRule ^(.*)$ page.php [L]

如果%{REQUEST_FILENAME}没有正确指向子目录的实际文件路径(比如服务器DocumentRoot配置错误),会导致"文件存在"的判断失效,进而触发重写规则。

2. 确认page.php是否被隐性执行

即使没看到Hello World输出,也不代表page.php没被执行:

  • 在page.php开头添加日志代码,强制记录执行痕迹:
    file_put_contents('/tmp/page_exec.log', 'page.php executed: ' . date('Y-m-d H:i:s') . ' | Request: ' . $_SERVER['REQUEST_URI'] . "\n", FILE_APPEND);
    
    执行测试后查看日志,就能明确page.php是否被触发。
  • 检查define_session.php和write_session.php是否通过include/require间接引入了page.php,哪怕是嵌套引入,都会执行其中的session_destroy()逻辑。
  • 用浏览器开发者工具的「网络」面板,查看所有请求记录,确认是否存在对page.php的隐性请求(比如301/302跳转后又被重定向回来)。

3. 排查Session Cookie的作用域冲突

session_start()默认会将Session Cookie的路径设为当前执行脚本的目录:

  • page.php在根目录,执行session_start()后,Session Cookie的路径会被设为/(全站有效)。
  • 子目录的脚本调用session_start()时,会共享这个根路径的Cookie。一旦page.php执行session_destroy(),整个站点的Session都会被销毁,哪怕请求的是子目录文件。

4. 检查服务器重写配置的有效性

  • 确认Apache的mod_rewrite模块已启用,且根目录的服务器配置中设置了AllowOverride All,否则.htaccess的规则可能无法完全生效。
  • 检查/test子目录下是否存在独立的.htaccess文件,其规则可能与根目录规则冲突,导致意外重写。

内容的提问来源于stack exchange,提问作者MartinS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 12:04:56