游客发表

nginx 伪静态

发帖时间:2026-10-17 04:37:24

伪静态这个词,静态刚接触 Nginx 的静态人容易被它唬住,觉得是静态什么高深技术。其实它干的静态事特别简单:把浏览器地址栏里那种带问号、带一长串参数的静态动态 URL,改写成看起来像静态页面的静态形式。比如把 /article.php?静态id=123 变成 /article/123.html。服务器内部该跑 PHP 还是静态跑 PHP,该查数据库还是静态查数据库,只是静态外面套了层好看的外壳。

为什么要在 Nginx 上折腾这个?静态我见过一个挺典型的场景。有个做内容站的静态朋友,早期用 WordPress,静态链接是静态 /?p=456 这种。后来想换 CMS,静态发现旧链接全得做 301 跳转,否则搜索引擎收录的页面全废。如果一开始就用伪静态规则把链接固定成 /archives/456.html,换程序时只要让新程序也遵守同样的 URL 规则,数据库怎么变都无所谓。URL 成了稳定的接口,后端实现反而可以随便换。

Nginx 里做伪静态靠的是 rewrite 指令,写在 server 或 location 块里。最基础的写法长这样:

rewrite ^/article/(\d+)\.html$ /article.php?id=$1 last; 

这行规则的意思是:用户访问 /article/123.html,Nginx 内部把它转成 /article.php?id=123 去处理。last 标志表示重写后重新匹配 location,通常配合 PHP 的 fastcgi 配置使用。如果写成 break,就在当前 location 里直接处理,不再往下匹配。

实际配的时候有个坑我踩过。规则顺序很重要,Nginx 的 rewrite 是按配置文件里出现的先后顺序执行的,匹配到一条就停。有次我把一条通配规则写在了具体规则前面,结果所有请求都被那条通配规则截胡了,后面的规则形同虚设。所以具体路径的规则要往前放,泛匹配的往后放。

另一个容易忽略的点是 try_files。伪静态规则没匹配上的请求,得有个兜底方案。常见做法是:

location / {  try_files $uri $uri/ /index.php?$query_string; } 

这段的意思是:先找有没有对应的真实文件,没有就找目录,再没有就统一交给 index.php 处理。很多 PHP 框架的路由就是靠这个机制工作的。Nginx 本身不解析 PHP,它只是把请求转发给 PHP-FPM,具体怎么路由由框架代码决定。

伪静态和真静态有个本质区别:真静态是服务器上确实存在一个 HTML 文件,Nginx 直接读文件返回,不经过 PHP。伪静态是每次请求都要走一遍 rewrite 规则,然后交给 PHP 重新生成页面。性能上真静态肯定更快,但伪静态胜在灵活——内容变了不用重新生成文件,改数据库就行。流量不大的站点,这点性能差异基本可以忽略。

有人问能不能用伪静态来隐藏真实文件路径,比如防止别人直接访问 /admin.php。可以,但别指望它能当安全措施。rewrite 规则是明写在配置文件里的,稍微懂点的人一看就知道真实路径是什么。真要保护后台,还是得靠 IP 白名单、HTTP 认证这些手段。

调试 rewrite 规则时,我习惯先开 rewrite_log on;,然后看 error.log,Nginx 会把每条规则的匹配过程打出来。比对着浏览器一遍遍试快得多。规则写多了容易乱,建议按功能分组,加注释,过两个月回头看还能明白当初为什么这么写。

说到底,伪静态就是个 URL 美化工具,别把它想复杂了。规则写对,测试通过,剩下的交给后端。它不解决业务问题,只解决地址栏好不好看的问题。

    热门排行

    友情链接