.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开头添加日志代码,强制记录执行痕迹:
执行测试后查看日志,就能明确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); - 检查
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
相关产品推荐
相关产品推荐

