本站在允许 JavaScript 运行的环境下浏览效果更佳


解决 halo umami plugin CORS&CSP 跨域报错问题

现象

未按照该插件项目 README 配置前,后台有:
Refused to frame 'https://umami.howiehz.top/' because an ancestor violates the following Content Security Policy directive: "frame-ancestors 'self'".
按照该插件项目 README 配置后,博客页面有:
No 'Access-Control-Allow-Origin' header is present on the requested resource

初步尝试

halo的umami插件的功能有一个是把统计界面嵌入后台管理页面
我在配置完成插件后,进入对应界面
出现报错Refused to frame 'https://umami.howiehz.top/' because an ancestor violates the following Content Security Policy directive: "frame-ancestors 'self'".

于是按照该插件项目 README 文档中在 Console 无法加载 Umami 的页面,出现了 CORS 和 CSP 的错误。的解决办法,尝试修改了 Nginx 配置

map $http_origin $corsHost {
    default 0; 
    ~https://howiehz.top https://howiehz.top; 
    #...
}
server {
    listen 443 ssl http2 ; 
    listen [::]:443 ssl http2 ; 
    server_name umami.howiehz.top; 
    #...
    add_header Access-Control-Allow-Origin $corsHost; 
    add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS'; 
    add_header Access-Control-Allow-Credentials true; 
    add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization,Origin,token,Accept,type,payload'; 
    if ($request_method = 'OPTIONS' ) {
        return 204; 
    }
    add_header Content-Security-Policy 'frame-ancestors howiehz.top'; 
    
    location ^~ / {
    proxy_hide_header 'Access-Control-Allow-Origin'; 
    proxy_hide_header 'Content-Security-Policy'; 
    proxy_hide_header 'Access-Control-Allow-Methods'; 
    proxy_hide_header 'Access-Control-Allow-Credentials'; 
    proxy_hide_header 'Access-Control-Allow-Headers'; 
    proxy_pass http://192.168.256.256:3000; 
    #...
    }
}

CSP 问题解决了,后台可以正常嵌入 Umami 统计页面了
但是出现了一堆 CROS 错误,Umami 也无法正常跟踪

初步解决

既然是跨域问题,要求协议,端口,域名都一致
那就在 Nginx 把 https://howiehz.top/api/ 反代到 https://umami.howiehz.top/api/
的确解决了查询 API 产生的 CROS 问题
但是 Umami 自动生成的跟踪脚本内依然使用的是https://umami.howiehz.top/api/
问题并未完全解决
现在会产生类似 Failed to load https://xxxxx: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'https://aaaaa' is therefore not allowed access. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled. 的报错

忽略也是一种解决方法

经过检索 no-cors 相关内容,得知,发送统计信息是没有问题的,
只是不能从 https://umami.howiehz.top/api/ 获取
所以虽然报错,但是不影响正常功能,
实际上 Umami 服务也在正常统计验证了这一点

最后的解决方法

先引用一条动态

halo-sigs/plugin-umami 的文档搞麻了,
搞了一堆 cors 相关配置,但是还是 cors 报错。
问了一圈其他的站长,都说啥都不用配置,直接用,就没啥 cors 问题。
于是我去 nginx 照着上面项目 readme 设置的都删掉,就留 1panel 自动生成的配置。
你猜怎么着,都好了,哈哈哈
#杂记 #网站建设 #难蚌

删掉按照项目 README 添加的配置,
没了 CORS 问题,但是 CSP 问题又出现了

经过测试其实只要加一句就可以解决 CSP 问题,也不会引入 CORS 问题
那些 add_header 加了反而有问题

server {
    #...
    location ^~ / {
    proxy_hide_header 'Content-Security-Policy';
    #....
    }
}