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

编写保留$_POST且移除扩展名的.htaccess后,部分页面扩展名复现问题咨询

排查PHP扩展名回显问题的思路

嘿,你的.htaccess规则本身逻辑是没问题的,但出现这种销毁会话后恢复正常的现象,大概率和页面链接的硬编码、会话中存储的路径有关,我给你梳理几个排查方向:

1. 检查页面内的跳转链接

你提到从Site/about.php返回时显示Site/home.php,首先要确认返回按钮/链接的代码是不是硬写了.php后缀。比如:

  • 错误写法:<a href="Site/home.php">返回首页</a>
  • 正确写法:<a href="Site/home">返回首页</a>

如果是用PHP动态生成链接(比如从数据库或配置里读取),要确保输出的是无后缀的路径,避免直接拼接.php。

2. 排查会话中存储的路径数据

既然销毁会话后问题消失,说明你的代码可能在$_SESSION里保存了页面的访问路径,而且保存的是带.php后缀的原始路径。举个例子,如果有类似这样的代码:

$_SESSION['last_visited_page'] = $_SERVER['REQUEST_URI'];

当用户访问Site/about.php时,REQUEST_URI的值就是/Site/about.php,后续跳转时如果直接用这个会话值,就会带出.php后缀。

解决办法是存储前先移除.php后缀,比如:

$current_path = str_replace('.php', '', $_SERVER['REQUEST_URI']);
$_SESSION['last_visited_page'] = $current_path;

3. 浏览器缓存的干扰

你的规则里用了R=301(永久重定向),浏览器会缓存这个重定向规则,可能导致旧的带后缀路径被缓存下来。可以先做个临时测试:

  • 把.htaccess里的R=301改成R=302(临时重定向)
  • 清空浏览器缓存,用隐私模式访问网站

如果问题消失,说明是缓存导致的,改回R=301即可,后续用户的浏览器会逐步更新缓存。

4. 补充验证.htaccess规则顺序

你的规则顺序是正确的,但可以再加一条规则确保所有非POST的带.php请求都被重定向,避免遗漏:

# 额外:强制重定向所有带.php的GET/HEAD请求
RewriteCond %{REQUEST_METHOD} !POST
RewriteCond %{REQUEST_URI} \.php$ [NC]
RewriteRule ^(.+)\.php$ /$1 [R=301,L,NE]

这条和你现有规则的第二部分类似,但更明确,确保不会漏掉任何带.php的GET请求。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 22:47:28