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

.htaccess重写规则问题:$_SERVER['PHP_SELF']无法获取完整路径

解决URL重写后$_SERVER['PHP_SELF']显示不全的问题

问题根源

当前的.htaccess规则是给每个请求的文件名追加.php,当访问https://domain/folder/user/1时,规则会尝试将请求重写到folder/user/1.php(若该文件不存在则会引发后续问题),而非让user.php来处理整个user/1路径的请求。这导致$_SERVER['PHP_SELF']仅识别到实际执行的脚本路径,而非原始请求的完整路径。

解决方案

调整重写规则,让/user/xxx这类请求直接路由到user.php,同时保留完整的路径信息作为PATH_INFO,这样$_SERVER['PHP_SELF']就能显示完整的请求路径。

针对单个user路径的规则

如果仅需处理user相关的请求,使用以下规则:

RewriteEngine On

# 排除真实存在的文件和目录
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# 将/user/xxx路由到user.php/xxx,保留路径信息
RewriteRule ^user/(.*)$ user.php/$1 [L,QSA]

# 处理直接访问/user的情况
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^user$ user.php [L,QSA]

通用规则(适用于folder下所有类似路径)

如果需要让folder下所有xxx/yyy格式的请求都路由到xxx.php/yyy,使用以下规则:

RewriteEngine On

# 排除真实存在的文件和目录
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# 匹配第一个路径段作为脚本名,后续部分作为路径信息
RewriteRule ^([^/]+)/(.*)$ $1.php/$2 [L,QSA]

# 处理单个路径段的请求(如/user)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)$ $1.php [L,QSA]

补充说明

  • 调整规则后,访问https://domain/folder/user/1时,$_SERVER['PHP_SELF']会显示为/folder/user.php/1;若你需要的是原始请求的完整路径(/folder/user/1),建议直接使用$_SERVER['REQUEST_URI'],它会直接返回用户实际请求的路径,无需依赖重写规则调整。
  • 确保folder目录下的目标PHP文件(如user.php)存在,否则会出现404错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 04:52:40