如何在Google App Engine上配置Rails应用实现HTTP转HTTPS重定向
嘿,我来帮你搞定这个HTTP转HTTPS的问题!你现在的配置踩了一个Ruby运行时特有的小坑,我一步步给你理顺:
1. 修正app.yaml的核心配置
你之前的script: config/application.rb是错的——Google App Engine的Ruby运行时不会直接加载这个文件,正确的做法是用script: auto让它自动识别Rails的入口(也就是config.ru)。修改后的app.yaml应该是这样:
handlers: - url: /.* script: auto secure: always redirect_http_response_code: 301
secure: always会让GAE的负载均衡直接把HTTP请求重定向到HTTPS,而redirect_http_response_code: 301指定了永久重定向(对SEO更友好)。
2. 让Rails识别GAE的HTTPS代理头
GAE的负载均衡会把HTTPS请求转换成HTTP传给你的Rails应用,同时通过X-Forwarded-Proto头告诉应用原始请求是HTTPS。所以你需要让Rails信任这个头,并且强制HTTPS:
打开config/environments/production.rb,添加/修改这几行:
# 强制所有请求使用HTTPS config.force_ssl = true # 配置HSTS(可选但推荐,让浏览器后续直接用HTTPS访问) config.ssl_options = { hsts: { expires: 1.year.to_i, subdomains: true } } # 信任GAE的代理头,让Rails识别真实的请求协议 config.action_dispatch.trusted_proxies = [:all]
如果不想信任所有代理(更安全的做法),可以替换成GAE的官方IP段,但[:all]在GAE环境下是安全的,因为所有请求都经过GAE的负载均衡。
3. 重新部署测试
把修改后的app.yaml和Rails代码重新部署到GAE:
gcloud app deploy
之后用curl或者浏览器访问HTTP地址,应该会自动301跳转到对应的HTTPS地址了。
为什么原来的配置不生效?
核心问题是script: config/application.rb导致GAE无法正确启动你的Rails应用,连基本的请求路由都处理不了,更别提触发secure: always的重定向规则了。Ruby运行时需要的是Rack入口(config.ru),用script: auto就能自动帮你关联到正确的入口文件。
内容的提问来源于stack exchange,提问作者FelixFortis

