無.Flac's Blog

無.Flac

配置Halo-Umami插件

10
2025-09-23

在网站运营中,数据分析是优化用户体验和内容策略的重要环节。对于使用 Halo 搭建网站的用户而言,应用市场提供了丰富的插件选择,其中 Umami 插件 因其轻量化、开源和隐私友好而备受关注。

什么是 Umami?

Umami 是一款开源的网页统计工具,致力于提供简洁、直观的数据分析体验。与传统分析工具相比,Umami 不依赖第三方服务,不收集用户个人信息,非常适合注重隐私和性能的站长使用。其核心特点包括:

  • 轻量高效:数据收集和展示快速,几乎不影响网站性能。

  • 隐私保护:默认不收集个人身份信息,符合 GDPR 等隐私法规。

  • 可自托管:无需依赖第三方平台,所有数据均由自己掌控。

  • 界面简洁:统计面板直观明了,即使非技术用户也能快速上手。


在Halo中使用 Umami 插件

①安装 Umami 插件

打开 Halo 应用市场,搜索 “Umami”,安装完成后,插件会出现在 Halo 的插件管理列表中。

②配置 Umami 实例

注意:本文不涉及 Umami 自托管实例的安装和配置,仅介绍在 Halo 中使用 Umami 插件进行网站统计的操作方法。如需部署自托管实例,请参考 Umami 官方文档。

③多站点配置 Umami 插件

在使用 Umami 插件的过程中,我遇到了一些跨域(CORS)和内容安全策略(CSP)的问题。由于我管理多个 Halo 网站,需要让每个站点都能正常访问 Umami,因此我对 Nginx 做了一些定制配置,具体如下:

>> CORS 动态配置

使用 map 根据请求的 Origin 动态返回允许的域名,保证不同站点都能正确跨域访问 Umami。

map $http_origin $cors_origin {

    default "";

    "https://xxx.domain.com"   "https://xxx.domain.com";

    "https://yyy.domain.com"  "https://yyy.domain.com";

}

$cors_origin 是前面 map 定义的变量,根据请求的来源动态返回允许的域名。always 表示无论响应状态码是多少,头信息都添加。

add_header Access-Control-Allow-Origin $cors_origin always; 

>> CSP 相关配置

防止网页被未知来源的站点使用 <iframe> 嵌入你的网页,提高安全性。

'self':允许本域名嵌入;https://xxx.domain.comhttps://yyy.domain.com:允许指定的域名嵌入

add_header Content-Security-Policy "frame-ancestors 'self' https://xxx.domain.com https://yyy.domain.com" always;

>> Nginx详细配置 - 单一站点

直接复制标注代码到nginx配置即可,1panelopenresty同理。

server {
    listen 80 ; 
    listen 443 ssl ; 
    server_name umami.domain.com;  // 此处设置你的umami站点
    ....

    // 复制以下配置,此处和Umami插件配置一样
    add_header Access-Control-Allow-Origin 'https://halo.domain.com'; //此处需改为你的Halo站点
    add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS'; 
    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'; 
    if ($request_method = 'OPTIONS' ) {
        return 204; 
    }

    // 复制以下配置,此处设置哪些站点可嵌入 <iframe>
    add_header Content-Security-Policy 'frame-ancestors halo.domain.com'; // 此处需改为你的Halo站点

    
    location / {
        proxy_set_header Host $host; 
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
        proxy_set_header X-Forwarded-Host $server_name; 
        ...

        // 复制以下配置,此处和Umami插件配置一样
        proxy_hide_header 'Access-Control-Allow-Origin'; 
        proxy_hide_header 'Content-Security-Policy'; 
    }
    http2 on; 
    if ($scheme = http) {
        return 301 https://$host$request_uri; 
    }
     ... 
}

>> Nginx详细配置 - 多站点

直接复制标注代码到nginx配置即可,1panelopenresty同理。

// 此处调用map方法以实现多站点访问
map $http_origin $cors_origin {
    default "";
    "https://xxx.domain.com"   "https://xxx.domain.com";
    "https://yyy.domain.com"   "https://yyy.domain.com";
}

server {
    listen 80 ; 
    listen 443 ssl ; 
    server_name umami.domain.com;  // 此处设置你的umami站点
    ....

    // 复制以下配置,此处和Umami插件配置一样
    add_header Access-Control-Allow-Origin $cors_origin always; 
    add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS'; 
    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'; 
    if ($request_method = 'OPTIONS' ) {
        return 204; 
    }

    // 复制以下配置,此处设置哪些站点可嵌入 <iframe>
    add_header Content-Security-Policy "frame-ancestors 'self' https://xxx.domain.com https://yyy.domain.com" always;

    
    location / {
        proxy_set_header Host $host; 
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
        proxy_set_header X-Forwarded-Host $server_name; 
        ...

        // 复制以下配置,此处和Umami插件配置一样
        proxy_hide_header 'Access-Control-Allow-Origin'; 
        proxy_hide_header 'Content-Security-Policy'; 
    }
    http2 on; 
    if ($scheme = http) {
        return 301 https://$host$request_uri; 
    }
     ... 
}