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; # 加入这条
}