php本身不直接实现伪静态,而是依赖web服务器(如apache、nginx)重写url,再由php解析重写后的路径;apache需启用mod_rewrite、allowoverride all并配置.htaccess,nginx需在server块中用try_files或rewrite规则,php通过$_get、path_info等获取路由信息。

PHP源码本身不直接“写伪静态”,而是靠服务器重写规则把用户看到的干净URL(比如 /article/123)转给PHP脚本处理(比如 index.php?id=123),再由PHP代码按原逻辑响应。关键不在改PHP代码,而在配对服务器+适配程序逻辑。
Apache环境:用.htaccess实现重写
适用于大多数共享主机和本地开发环境,前提是mod_rewrite已启用、AllowOverride允许覆盖。
- 确认Apache加载了
mod_rewrite模块(检查httpd.conf中LoadModule rewrite_module modules/mod_rewrite.so未被注释) - 在网站根目录新建
.htaccess文件(注意开头是英文点号,Windows下需用“另存为”指定名称) - 写入标准规则,例如将
/article/123映射到index.php?id=123:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^article/([0-9]+)$ index.php?id=$1 [L]
若项目部署在子目录(如/myapp/),需加RewriteBase /myapp/,否则路径会错位。
Nginx环境:在server块中配置rewrite
Nginx不读.htaccess,必须修改站点配置文件(如/etc/nginx/sites-available/your-site),并在server{}内设置。
- 推荐使用
try_files方式,更稳定、避免if陷阱:
location / {
try_files $uri $uri/ /index.php?s=$uri&$args;
}
- 确保PHP处理块存在且正确传递参数:
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
include fastcgi_params;
}
规则生效后,访问/article/123时,PHP可通过$_GET['s']获取路径字符串,再由框架或自定义路由解析。
PHP程序端配合要点
服务器规则只是“转发”,真正让伪静态跑起来,还得程序自己接得住。
- 前端生成链接时,必须输出伪静态格式,如
@#@#@#@#@#@#@#@#@#@0,不能还写index.php?id=123 - 接收参数时保持兼容:若规则映射到
index.php?id=123,就用$_GET['id'];若走s=参数(如ThinkPHP),则需解析$_GET['s']并拆分路由 - 避免静态资源被误重写:规则中
!-f和!-d条件就是防止/css/style.css这类真实文件被转到PHP - 使用绝对路径或
<base href="/">防CSS/JS加载失败
常见问题排查方向
伪静态配完打不开?先盯这三个环节:
-
服务器层:Apache是否重启?Nginx是否
nginx -t && nginx -s reload?.htaccess是否放对位置(如ThinkPHP6必须放在public/目录)? -
规则层:正则是否匹配目标URL?
[L]标志是否遗漏?Nginx中&是否误写成&导致语法错误? -
程序层:PHP是否收到参数?
var_dump($_GET)看看实际传了什么;框架路由是否开启(如ThinkPHP需'url_route_on'=>true)?
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











