phpenv不处理伪静态,它仅管理PHP版本;伪静态需由Web服务器(如Apache或Nginx)配置实现,问题必出在服务器层而非phpenv。

phpenv 本身不处理伪静态,它只是 PHP 版本管理工具(类似 rbenv 或 nvm),不参与 Web 服务器配置、URL 重写或路由转发。你真正要配的是运行 PHP 的 Web 服务器(如 Apache、Nginx)——phpenv 只管让你用哪个 php 版本,不管请求怎么被 rewrite。
所以如果你在用 phpenv 后发现伪静态失效,问题一定出在 Web 服务器层,而不是 phpenv 没设对。
Apache 下伪静态失效:检查 .htaccess 是否被读取
常见现象是访问 /article/123 直接 404,或仍跳转到带 ?id=123 的原始 URL。
- 确保 Apache 已启用
mod_rewrite:运行apache2ctl -M | grep rewrite(Linux/macOS)或查看phpinfo()中 “Loaded Modules” 是否含rewrite_module -
.htaccess文件必须放在 Web 根目录(如public/或项目根),且文件名严格为.htaccess(开头英文点,无扩展名) - Apache 配置中必须允许覆盖:
AllowOverride All(不能是None),且对应目录需有Options +FollowSymLinks - 如果用的是 Apache 2.4+,
Require all granted缺失也会导致.htaccess被忽略
示例最小可用规则(放在 .htaccess 中):
立即学习“PHP免费学习笔记(深入)”;
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^article/([0-9]+)$ /article.php?id=$1 [L]Nginx 下伪静态配置:不能靠 .htaccess,必须改 server 块
Nginx 完全不读 .htaccess,所有 rewrite 规则必须写进站点配置文件(如 /etc/nginx/sites-available/your-site)。
- 规则位置必须在
server { ... }内,通常放在location / { ... }里或单独location块中 - 注意
last和break的区别:last会重新匹配 location,break终止重写但不重匹配;PHP 路由常用last - 若用
index.php?s=xxx类型入口(如 ThinkPHP),确保 PHP 处理块已存在且能正确传递$args或PATH_INFO
典型配置片段:
location / {
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php?s=$1 last;
}
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}执行 nginx -t && nginx -s reload 才生效。
PATH_INFO 模式下伪静态:PHP 代码层要配合解析
有些框架(如早期 ThinkPHP)依赖 $_SERVER['PATH_INFO'] 解析路径,这要求:
- PHP 配置中
cgi.fix_pathinfo=1(默认开启,但某些 Docker 或安全加固环境会被关掉) - Apache 需启用
AcceptPathInfo On,或 Nginx 显式设置fastcgi_split_path_info并传参 - Apache 的 rewrite 规则不能丢掉路径段,例如要用
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L],而不是重定向到index.php?id=xxx
若 $_SERVER['PATH_INFO'] 始终为空,先检查:
-
phpinfo()中cgi.fix_pathinfo值是否为On - Nginx 配置里是否有
fastcgi_param PATH_INFO $fastcgi_path_info;这一行 - Apache 的
.htaccess是否用了[PT](PassThrough)标志,否则 PATH_INFO 无法透传
伪静态真正卡住的地方,往往不是规则写错,而是服务器权限、模块开关、配置层级(主配置 vs 虚拟主机 vs .htaccess)或 PHP 参数透传没对齐。调的时候建议先确认 mod_rewrite 或 Nginx rewrite 模块确实在工作,再一层层看请求是否真到了 PHP,最后才查 PHP 怎么解析那个路径。



















