Typecho读取上传的文件显示403

之前个性化typecho博客的时候出现如下问题: 从本地把文件拖进typecho的文件持久化目录之后,文件无法访问,用url访问或者typecho自定义php页面调用(例如src: url('<?php $this->options->siteUrl(); ?>usr/uploads/SarasaGothicK-Regular.ttf')})都报403错。一开始以为是我上传的这个字体要写入权限,但运行了chmod也没用。摸索了很久终于发现问题,如果不是通过typecho后台上传渠道上传(例如从本地拖文件),会导致文件的所有者为ssh或docker宿主管理员的身份。而typecho容器内使用的所有者为www-data,从而导致没权限访问。所以最直接暴力的解决方案就是在typecho docker内(docker exec或通过docker管理页面进入其终端机)执行

chown www-data:www-data 上传的文件在容器内的路径
chown -R www-data:www-data 上传的文件所在文件夹在容器内的路径

不过这样每次上传之后都要执行一遍,你可以写一个hook自动触发。不过最好最简单的解决方法还是从typecho后台进入上传,这样文件的所有者会自动变成www-data

插件导入后只显示“即插即用”或点击设置报错

如果在插件列表只有一行新纪录,插件的名字描述都没有,只显示“即插即用”。一般是插件文件夹在本地持久化后权限的设置问题。解决方法为:进入容器内应用后执行:

chmod -R 777 /var/usr/plugins

如果是插件名字和描述等正常显示,但是一点击设置就报错。或者描述显示插件不安全,建议移除云云。一般是插件的文件夹和插件名不匹配导致的。可能是由于你从github下载的文件夹名后面跟了master/main等分支名。解决方法为:找到在本地持久化的插件文件夹,把对应的插件文件夹名 改成 后台插件管理界面显示的插件名。

Typecho插件提供的额外接口无法访问(404)

在 Docker 内部署 Typecho 并某些可以增加接口的插件后(例如API工具),访问 http://{host}/api/posts 返回 Apache 默认 “Not Found”,后台与前台其它页面正常;改用 http://{host}/index.php/api/posts 则接口可返回 JSON。

根因
插件通过 Helper::addRoute 注册的是伪静态路径 /api/[type],需由 Web 服务器将请求转发至 index.php,再由 Typecho 路由分发。当前站点根目录未提供生效的 URL 重写(如缺失或未生效的 .htaccess,或虚拟主机未启用 mod_rewrite / AllowOverride),Apache 将 /api/posts 按物理路径解析,找不到对应文件即由 Apache 直接 404,请求未进入 PHP,故与插件业务逻辑无关。

解决方案
在 Typecho 根目录配置并确保生效 Typecho 官方推荐的 Apache 重写规则(或通过 vhost 等价配置),启用 mod_rewrite,并为站点目录设置合适的 AllowOverride,使形如 /api/posts 的请求在服务器层重写为 index.php。配置生效后,短路径 /api/posts 与带 index.php 的路径行为一致。

标签:无

你的评论