Z-Blog 主题开了伪静态,附件路径全部变成 404

· zblog · 阅读 10
摘要

换服务器顺手把伪静态打开了,首页和文章页都正常,就是图片全裂。右键看地址,路径是对的,浏览器直接输也能打开——说明问题不在文件本身,在 URL 生成规则上。 折腾了大概两小时,记一下。 先分清「文件在不在」和「URL 对不对」 这两件事经常

换服务器顺手把伪静态打开了,首页和文章页都正常,就是图片全裂。右键看地址,路径是对的,浏览器直接输也能打开——说明问题不在文件本身,在 URL 生成规则上。

折腾了大概两小时,记一下。

先分清「文件在不在」和「URL 对不对」

这两件事经常被混在一起。附件裂图的时候我第一个反应是权限,检查了 upload 目录,777 也给了,还是裂。后来用 curl 直接请求那张图的完整 URL:

curl -I https://你的域名/zb_users/upload/2026/10/xxx.jpg

返回 200。那就不是文件问题,是页面里输出的地址错了。回头翻 HTML 源码,发现 src 里写的是 /zb_users/upload/...,但站点根目录其实挂在二级路径下。

Host 和 Index 两个配置

Z-Blog 的站点地址在后台「网站设置」里有单独一项,伪静态开着的时候,生成绝对地址依赖的就是它。如果那栏填的是带子目录的完整地址,而 zb_users/c_option.php 里的 ZC_BLOG_HOST 没同步,两边就打架了。

我这次的实际情况是:伪静态规则里把 /zb_users/ 也纳入了重写范围,请求附件时被 index.php 接走了。看 nginx 配置:

# 错的位置,这行太靠前了
location / {
    if (-f $request_filename) {
        break;
    }
    rewrite ^(.*)$ /index.php?$1 last;
}

得在它前面先放行真实存在的文件:

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

try_files 比手写 if + rewrite 靠谱,它会先看磁盘上有没有这个文件。后面那段 /index.php?$args 只在前两者都找不到时才走。

Nginx 之外,还有个 PHP 层面的坑

如果你用的是 Apache,.htaccess 里那几条 RewriteCond %{REQUEST_FILENAME} !-f 千万别删。我见过有人嫌配置长直接精简掉,结果所有静态资源都被重写了,表现和上面一模一样。

改完记得重启 nginx,systemctl reload nginx 就够,不用 restart。

最后说一句我不太确定的:Z-Blog 后台有个「附件 URL 前缀」的设置项,位置我记不住在哪一级菜单了,如果你改过它,优先级可能覆盖前面的规则。真要查就从 c_option.php 搜一遍 host 相关常量,比在后台点来点去快。