CDN回源路径必须设为/public且服务器根目录指向public,静态资源引用须用asset()函数并配置asset_host,PHP文件禁止缓存,public目录权限需确保Web服务可读。

CDN回源路径必须匹配ThinkPHP的public目录结构
云服务器上配CDN,最常卡在回源404——CDN节点请求静态资源时,回源到你的服务器,结果返回404。根本原因是CDN默认回源到根目录(如 /var/www/html),但ThinkPHP要求所有静态资源(css、js、images)必须从 public/ 目录下被访问,而框架的入口文件 public/index.php 也在此处。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- CDN控制台里把「回源路径」显式设为
/public(不是/public/,末尾斜杠部分CDN厂商处理不一致,阿里云需带斜杠,腾讯云建议不带,以实测curl -I http://your-cdn.com/static/css/app.css返回200为准) - 确保服务器Nginx/Apache的站点根目录指向
/var/www/your-project/public,而非项目根目录 - 别在
public外层再建一层static目录——ThinkPHP不识别,CDN也无法映射
模板中用asset()生成URL,别拼接字符串
很多人在模板里写 <link href="/static/css/app.css">,上线CDN后路径就断了:本地能打开,CDN节点缓存的是旧地址,或直接回源失败。ThinkPHP的 asset() 函数不是可有可无的语法糖,它是路径适配的核心开关。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 所有静态资源引用必须走
{:asset('css/app.css')}(模板)或\think\facade\Url::asset('js/main.js')(PHP代码) - 配置
app.asset_host为CDN域名,例如https://cdn.example.com(注意协议必须写全,否则HTTPS站加载HTTP资源会拦截) - 如果CDN支持路径前缀(比如把所有
/static/请求转发到/public/static/),仍要设app.asset_host,否则asset()默认还是输出相对路径
CDN缓存规则要区分动静,避免PHP脚本被缓存
CDN默认可能对所有 .php 后缀放行,但如果你把 public/index.php 的请求也缓存了,用户就会看到过期的HTML或503错误——因为CDN返回的是上次执行的结果,而不是实时运行PHP。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 在CDN缓存规则里,明确设置:匹配
*.php的路径「不缓存」或「缓存时间0s」 - 只对明确的静态后缀缓存:
*.css、*.js、*.png、*.woff2等,缓存时间可设为1年(max-age=31536000) - 检查响应头:访问一个CSS文件,确认返回了
Cache-Control: public, max-age=31536000;访问/index.php或任意路由,必须是Cache-Control: no-cache, no-store, must-revalidate
public/static/ 目录权限和软链容易引发403
上线后突然所有静态资源报403 Forbidden,大概率不是CDN问题,而是服务器层面:Nginx/Apache拒绝读取 public/static/ 下的文件。常见于用软链接管理静态资源(比如把 public/static 指向 /data/assets),但没开 follow_symlinks,或SELinux阻止了跨区访问。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 用
ls -l public/static确认是不是软链;如果是,Nginx配置里加disable_symlinks off;(放在server块内) - 检查文件属主:确保
public/及其子目录属主是Web服务用户(如www-data或nginx),且至少有r-x权限(目录不能少x) - CentOS 7+/AlmaLinux上跑Apache,记得关SELinux或运行
setsebool -P httpd_read_user_content 1,否则即使权限对也会403
CDN和ThinkPHP的配合,本质是让「请求路径→服务器真实路径→CDN缓存策略」三者对齐。最容易被忽略的是回源路径和 asset() 的联动——改了一个,另一个不调,就白配。


















