Memos 同步思源笔记踩坑记录
起因
笔记又切换回思源笔记了,就想用 Memos 收集灵感然后同步到思源笔记。之前用过一个 Memos 同步插件,今天直接安装上,配置好令牌,结果一点同步,反复报错:
Access to fetch at 'https://memos.1du.fun/api/v1/users' from origin
'http://1.1du.fun:6806' has been blocked by CORS policy
经典的跨域错误。想着 1panel 后台网站配置跨域应该就行了。
第一坑:CORS 配置不生效
在 Nginx 里加了跨域头:
add_header Access-Control-Allow-Origin http://1.1du.fun:6806;
add_header Access-Control-Allow-Methods GET,POST,OPTIONS,PUT,DELETE;
add_header Access-Control-Allow-Headers "Authorization,User-Agent,origin,Accept" always;
保存重载,刷新页面——还是同样报错。
换了 Firefox、开了无痕模式,甚至换了台电脑,错误依旧。
第二坑:curl 能通,浏览器不通
用 curl 测试预检请求:
curl -I -X OPTIONS -H "Origin: http://1.1du.fun:6806" \
https://memos.1du.fun/api/v1/users
返回结果里明明有 <code>access-control-allow-origin</code> 头,状态码 204,一切正常。
但浏览器就是报 <code>No 'Access-Control-Allow-Origin' header</code>。
关键点来了:再测 GET 请求:
curl -I -H "Origin: http://1.1du.fun:6806" \
https://memos.1du.fun/api/v1/users
这次返回 501,而且没有 CORS 头!
预检请求(OPTIONS)有跨域头,实际请求(GET)没有。这就奇怪了。
第三坑:Nginx 的 add_header 覆盖机制
翻看 Nginx 配置,发现第 37 行有个:
include /www/sites/memos.1du.fun/proxy/*.conf;
打开这个 <code>root.conf</code>,第 12 行写着:
add_header X-Cache $upstream_cache_status;
破案了!
Nginx 有个坑爹特性:只要 location 块里用了任何一个 add_header,就会清空从 server 块继承的所有 add_header。
所以虽然我主配置里写了 CORS 头,但被这个 <code>root.conf</code> 给覆盖了。
第四坑:双引号和 always 参数
在 <code>root.conf</code> 里补上 CORS 配置:
add_header Access-Control-Allow-Origin http://1.1du.fun:6806 always;
add_header Access-Control-Allow-Methods GET,POST,OPTIONS,PUT,DELETE always;
还是不行。
改完还是报错。
第五坑:内网直连也跨域
试了下直接用内网 IP <code>http://192.168.1.145:5230</code>,居然还是 CORS 错误。
这说明问题不在 Nginx,是 Memos 本身没返回跨域头。
终极方案:降级
折腾了几个小时,各种 Nginx 配置调来调去,就是不行。
直接降级 Memos 到 0.27 版本。
在 Memos 反向代理跨域设置里:
- 允许跨域来源填 <code>*</code>
允许所有来源跨域请求(docker 地址、客户端)。
思源笔记插件配置:
- Memos 地址:<code>http://memos.1du.fun</code>
- Token:从 Memos 账户设置里复制访问令牌
搞定!
总结
- 最终还是没解决 Memos 0.29 版本跨域问题,换 0.27 版本继续用。
- 不要追新 Memos 版本,稳定最重要。全网都在吐槽 Memos 大版本 API 文档经常大改,导致各种问题。
- 跨域问题,反向代理开启跨域即可。
折腾一下午,总算能同步了。早知道一开始就降级,少踩好多坑。