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返回结果里明明有 access-control-allow-origin 头,状态码 204,一切正常。
但浏览器就是报 No 'Access-Control-Allow-Origin' header。
关键点来了:再测 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;打开这个 root.conf,第 12 行写着:
add_header X-Cache $upstream_cache_status;破案了!
Nginx 有个坑爹特性:只要 location 块里用了任何一个 add_header,就会清空从 server 块继承的所有 add_header。
所以虽然我主配置里写了 CORS 头,但被这个 root.conf 给覆盖了。
第四坑:双引号和 always 参数
在 root.conf 里补上 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 http://192.168.1.145:5230,居然还是 CORS 错误。
这说明问题不在 Nginx,是 Memos 本身没返回跨域头。
终极方案:降级
折腾了几个小时,各种 Nginx 配置调来调去,就是不行。
直接降级 Memos 到 0.27 版本。
在 Memos 反向代理跨域设置里:
- 允许跨域来源填
*
允许所有来源跨域请求(docker 地址、客户端)。
思源笔记插件配置:
- Memos 地址:
http://memos.1du.fun - Token:从 Memos 账户设置里复制访问令牌
搞定!
总结
- 最终还是没解决 Memos 0.29 版本跨域问题,换 0.27 版本继续用。
- 不要追新 Memos 版本,稳定最重要。全网都在吐槽 Memos 大版本 API 文档经常大改,导致各种问题。
- 跨域问题,反向代理开启跨域即可。
折腾一下午,总算能同步了。早知道一开始就降级,少踩好多坑。
评论 (0)