Revel应用必须通过Nginx反向代理部署,禁止直接暴露公网端口;需绑定127.0.0.1:8089、配置proxy_pass指向http://127.0.0.1:8089,并严格设置Host、X-Real-IP、X-Forwarded-For、X-Forwarded-Proto等header,同时Revel端启用app.secure=true和app.trust.xfwd=true。

Revel 应用不能直接暴露在公网端口上,必须通过 Nginx 反向代理中转;否则会丢失 X-Real-IP、Host 等关键请求头,导致路由错误、静态资源 404、Cookie 域名失效等问题。
proxy_pass 必须指向 127.0.0.1:8089 这类本地地址
Revel 默认监听 :8089,但生产环境务必绑定到 127.0.0.1:8089(而非 :8089),防止外部直连。Nginx 的 proxy_pass 必须明确写成 http://127.0.0.1:8089,不能省略协议或写成 localhost——某些系统下 localhost 解析为 IPv6 地址,而 Revel 若未启用 IPv6 支持会导致连接拒绝。
- 正确:
proxy_pass http://127.0.0.1:8089; - 错误:
proxy_pass http://localhost:8089;或proxy_pass http://:8089; - Revel 启动命令应为:
revel run myapp prod -port=8089 -host=127.0.0.1
proxy_set_header 缺一不可,尤其 Host 和 X-Forwarded-For
Revel 依赖 Host 头做子域名路由(如 api.example.com)和生成绝对 URL;X-Forwarded-For 决定 Context.Request.RemoteAddr 的值。漏掉任一 header 都会导致重定向跳转错乱、CSRF 校验失败或日志 IP 全是 127.0.0.1。
- 必须设置:
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;(用于 HTTPS 判断)
location / 路径结尾不能带斜杠,否则 Revel 静态资源 404
Revel 的静态文件路由(如 /public/js/app.js)依赖精确的路径匹配。若 Nginx location 写成 location / { ... } 是安全的;但若写成 location /app/ { ... },又没在 Revel 中配置 app.path.prefix,所有静态资源请求都会被 Nginx 截断或转发错误路径,返回 404。
- 推荐配置:
location / { proxy_pass http://127.0.0.1:8089; } - 避免:
location /myapp/ { proxy_pass http://127.0.0.1:8089/; }(末尾斜杠会触发重写,破坏 Revel 路由) - 若必须加前缀(如部署在子路径),需同步修改 Revel 的
app.conf:app.path.prefix = "/myapp"
HTTPS 场景下必须透传 X-Forwarded-Proto 并检查 Revel 的 ForceSSL
当 Nginx 终止 HTTPS 后,后端 Revel 收不到原始协议信息,Context.Request.IsSecure() 会返回 false,导致重定向回 HTTP 或 HSTS 失效。此时仅靠 X-Forwarded-Proto 不够,还需 Revel 主动信任该 header。
- Nginx 配置中加:
proxy_set_header X-Forwarded-Proto $scheme; - Revel 的
app.conf中启用:app.secure = true和app.trust.xfwd = true - 否则即使 Nginx 配了 SSL,Revel 仍可能把登录跳转拼成
http://开头
最容易被忽略的是 Revel 的 app.trust.xfwd = true —— 它默认为 false,不手动开启,X-Forwarded-* 系列 header 全部被忽略,前面 Nginx 所有 header 设置都白配。


















