PHP网站伪静态真正由Web服务器实现:Apache依赖mod_rewrite模块和.htaccess规则,Nginx依赖server块中的location与try_files/rewrite指令;PHP端仅负责安全解析$_SERVER['REQUEST_URI']提取路由,不参与重写过程。
PHP网站本身不生成伪静态,真正起作用的是Web服务器对请求路径的重写。Apache靠
和
模块,Nginx靠
块里的
与
或
指令。PHP端只需正确接收并解析重写后的路径,不参与重写过程。
Apache下启用伪静态的关键三步
很多404或500错误不是规则写错,而是基础配置没到位:
打开
,确认
这行未被注释
找到对应网站根目录的
区块(如
),把
改成
在项目根目录新建
文件(注意是英文点开头、无扩展名),Windows记事本保存时选“所有文件”类型,避免存成
Apache常用.htaccess规则写法
通用兜底规则适合多数单入口应用(如ThinkPHP、自建路由):
必须放在第一行,否则整段失效
和
用于跳过真实存在的文件和目录,避免CSS、图片等静态资源被误转
中
保留原始查询参数(如
),
终止后续规则,防止循环
若站点部署在子目录(如
),需加
,否则重写路径会错位
Nginx伪静态配置避坑要点
Nginx不读
,所有规则必须写进
块,且语法和逻辑与Apache完全不同:
PHP 8.5.5
PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。
下载
立即学习
“
PHP免费学习笔记(深入)
”;
推荐用
——它先查文件、再查目录、最后 fallback,不触发内部重写,兼容性好,也不易出错
如果要用
,必须放在
里,且搭配
判断,不能直接照搬Apache的
表示内部重发(浏览器地址栏不变),
才是302跳转;别在
块里写
,那属于PHP执行阶段,重写必须发生在进入PHP前
确保
已正确定义,否则报
PHP端安全解析重写路径的方法
服务器转发后,PHP要从重写后的URL中提取有效路由信息,不能依赖原始
:
是最可靠来源,用
提取路径部分
再用
去首尾斜杠,然后
拆分段,比直接
更安全(避开查询参数和编码字符)
对关键路径段做白名单校验,比如
,防路径穿越或非法访问
不要用
作为唯一依据,它在不同服务器配置下行为不一致,
才是跨环境稳定的方案
.htaccessmod_rewriteserverlocationtry_filesrewritehttpd.confLoadModule rewrite_module modules/mod_rewrite.soAllowOverride NoneAllowOverride All.htaccess.htaccess.txtRewriteEngine OnRewriteCond %{REQUEST_FILENAME} !-f!-dRewriteRule ^(.*)$ index.php?url=$1 [QSA,L][QSA]?ref=abc[L]/myapp/RewriteBase /myapp/.htaccessservertry_files $uri $uri/ /index.php?$query_string;rewritelocation /if (!-e $request_filename)RewriteRulelastredirectlocation ~ \.php$rewritefastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;No input file specified$_GET$_SERVER['REQUEST_URI']parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH)trim($path, '/')explode('/', ...)explode('/', $_SERVER['REQUEST_URI'])in_array($segments[0], ['user', 'post', 'api'])PATH_INFO$_SERVER['REQUEST_URI']