Revel本身不支持HTTPS启动,需通过Nginx等反向代理卸载TLS;正确配置包括监听443端口、指定完整证书链、启用HSTS,并在Revel中手动处理X-Forwarded-Proto头以确保URL Scheme为https。

Revel 本身不直接支持 HTTPS 启动
Revel 的 revel run 和 revel start 命令默认只监听 HTTP(如 :9000),它没有内置 TLS 参数或证书加载机制。强行在 Revel 应用层做 HTTPS 终止,不仅违背其设计定位(应专注业务逻辑),还会引入证书热更新、SNI、HTTP/2 支持等额外复杂度。生产环境正确的做法是:让 Revel 保持纯 HTTP 服务,把 HTTPS 卸载交给成熟的反向代理(如 Nginx、Caddy)。
Nginx 反向代理配置 HTTPS 的关键项
在 Nginx 配置中启用 HTTPS,核心是三件事:监听 443 端口、指定证书路径、开启 SSL 协议与加密套件。常见漏配点包括证书链不全、未禁用老旧协议、缺少 HSTS 头。
-
ssl_certificate必须指向完整证书链(含中间 CA),不能只是域名证书 -
ssl_certificate_key对应私钥,权限建议设为600(仅 owner 可读) - 务必添加
ssl_protocols TLSv1.2 TLSv1.3;,显式禁用SSLv3和TLSv1.0/1.1 - 推荐加上
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;启用 HSTS - 后端代理仍走 HTTP:
proxy_pass http://127.0.0.1:8089;(假设 Revel 监听:8089)
示例片段:
server {
listen 443 ssl http2;
server_name example.com;
<pre class="brush:php;toolbar:false;">ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
location / {
proxy_pass http://127.0.0.1:8089;
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;
}
}
Revel 应用内需适配 X-Forwarded-* 头
如果不处理反向代理传来的头信息,c.Request.URL.Scheme 会仍是 http,导致生成的绝对 URL(如重定向、API 返回链接)出错。Revel 没有自动识别 X-Forwarded-Proto 的机制,必须手动在 Filter 中修正。
- 在
app/filter.go的过滤器链中插入自定义 Filter(放在RouterFilter之前) - 检查
c.Request.Header.Get("X-Forwarded-Proto") == "https",若是,则改写c.Request.URL.Scheme = "https" - 同时建议设置
c.Request.Host = c.Request.Header.Get("X-Forwarded-Host")(若存在) - 注意:仅在明确信任代理时才启用该逻辑,避免被恶意头欺骗
Let’s Encrypt 自动续期与 Revel 部署协同
证书自动更新(如 certbot renew)后,Nginx 需重载配置才能生效,但 Revel 进程本身无需重启。容易忽略的是文件权限问题——如果 certbot 以 root 运行,生成的证书可能对 Nginx worker 进程不可读;或者使用 --deploy-hook 时未正确触发 nginx -s reload。
- 确保证书目录(如
/etc/letsencrypt/)对www-data(Nginx 用户)可读 - 在
certbot的--deploy-hook中执行sudo nginx -s reload,并配置 sudoers 允许该命令免密 - Revel 应用无需感知证书变化,只要 Nginx 配置指向正确路径即可
HTTPS 不是开关按钮,而是端到端的信任链:从证书有效性、代理头传递、应用层 URL 构造,到客户端缓存策略,任何一环松动都可能导致混合内容警告或重定向循环。最常出问题的地方,往往不在 Nginx 配置本身,而在 Revel 没有正确信任 X-Forwarded-Proto 导致内部链接仍拼出 http://。











