.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
相关产品推荐
相关产品推荐

