thinkphp在nginx下伪静态应优先匹配静态资源后缀或目录,直接由nginx返回并缓存,再通过location /的try_files仅将非静态请求交index.php处理,实现动静分离。

ThinkPHP在Nginx下实现伪静态,关键不是“把所有请求都转给index.php”,而是**只转发动态路由请求,同时放行真实存在的静态文件(如CSS、JS、图片)**。否则每次访问logo.png都要走PHP,既拖慢速度,又浪费资源。
先明确哪些该排除:常见静态资源类型
通常需直接由Nginx处理、不经过PHP的资源包括:
- CSS、JS文件(.css、.js)
- 图片(.png、.jpg、.jpeg、.gif、.webp)
- 字体(.woff、.woff2、.ttf、.eot)
- 媒体(.mp4、.mp3、.pdf)
- 前端构建产物(如 /dist/、/static/ 目录下的全部内容)
推荐写法:用 location ~* 匹配静态后缀,内部 return 200 或配置缓存
在 server 块中,把静态资源规则放在 location / { } 之前(Nginx按顺序匹配,越靠前优先级越高):
location ~* \.(?:css|js|png|jpe?g|gif|webp|woff2?|ttf|eot|mp4|mp3|pdf)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
这段配置做了两件事:
- 用 ~* 不区分大小写匹配后缀,命中即终止后续 location 查找
- 直接由 Nginx 返回文件,并设置强缓存(1年),不进 PHP
注意:不要加 try_files $uri =404; —— 这会多一次磁盘判断,反而降低性能;只要文件真实存在且路径正确,Nginx 自然能读取并返回。
额外保护:排除特定目录(如 public/static)
如果项目把静态资源统一放在 /public/static/ 下,可单独拦截整个路径:
location ^~ /static/ {
alias /www/wwwroot/myapp/public/static/;
expires 1y;
add_header Cache-Control "public, immutable";
}
说明:
- ^~ 表示前缀匹配且最高优先级,比正则更高效
- alias 指向实际物理路径(注意末尾斜杠与路径拼接逻辑)
- 确保该目录不在 location / { } 的重写范围内
主路由规则:仅处理非静态请求
此时,你的主 location / 可放心使用 try_files,它只会在前面所有 location 都未匹配时才生效:
location / {
try_files $uri $uri/ /index.php?$query_string;
}
这个规则含义是:
- 先查 $uri 是否对应真实文件(已由上面的 location ~* 拦截)
- 再查是否为真实目录(如 /admin/,也常被静态化)
- 都不满足,才交给 /index.php 处理动态路由
这样就自然实现了「静态资源直出、动态请求交由框架」的分离。
不需要额外判断文件是否存在,也不用 if,结构清晰、性能高、兼容 ThinkPHP 6/8 所有版本。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











