Portainer 从 2.27.7 版本开始,经过反向代理访问时无法登录,报错 “Unable to login” 。

Portainer 后端报错:

portainer | 2025/09/16 07:34AM ERR github.com/portainer/portainer/api/http/csrf/csrf.go:100 > Failed to validate Origin or Referer | error="origin invalid" forwarded= host=xxx.xxxx.xxx origin=https://xxx.xxx.xxx referer=https://xxx.xxx.xxx/ request_url=/api/auth trusted_origins=["xxx.xxx.xxx"] x_forwarded_proto=

原因:2.27.7版本升级了 gorilla/csrf 这个第三方库,变得更严格地要求 Origin 和 Referer 头。

为了解决这个问题,Portainer 开发团队已经在 2.27.9 LTS 版本中新增了 --trusted-origins 启动参数和 TRUSTED_ORIGINS 环境变量。用户可以把指定域名加入信任列表。

在 Portainer 启动参数中填写

--trusted-origins https://xxx.xxx.xxx

如果是容器中运行的Portainer 则需要在环境变量中加入

-e TRUSTED_ORIGINS=docker.deadbush.top

如果是docker compose中运行的 Portainer 则需要在docker-compose.yaml中加入

environment:
  - TRUSTED_ORIGINS=https://xxx.xxx.xxx

注意:以上方法均不支持加自定义端口,如果是在非标准80/443端口上的反向代理仍然会报错 Unable to login,截止到目前 2.33.1 LTS 版本, Portainer 的 trusted-origins 仍然不支持自定义端口。

如果需要在非标准端口中反向代理 Portainer ,请在反向代理软件中设置剥离Origin请求头的端口。

以Nginx举例

location / {
    proxy_pass http://192.168.1.102:9000/;
    proxy_set_header HOST $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection upgrade;
    proxy_set_header Accept-Encoding gzip;
    proxy_set_header Origin $scheme://$host; # 加入这条
}

参考issue:https://github.com/portainer/portainer/issues/12748

枯死的灌木!