GAE执行GET请求出现两次调用问题,如何避免307重定向并默认启用HTTPS
问题根因
Google App Engine(GAE)标准环境的secure: always规则,对GET/HEAD类请求会按你配置的redirect_http_response_code: 301返回301永久重定向,但对携带请求体的非GET/HEAD请求,为了避免丢失请求数据,会默认返回307临时重定向,引导客户端用相同的请求方法和参数重定向到HTTPS地址,就会出现两次请求的现象。
解决方案
要完全避免307重定向同时强制HTTPS,按以下两步操作即可:
- 确保所有客户端请求直接使用HTTPS协议发起,不要在前端、接口调用代码中使用HTTP地址调用接口,从根源上避免触发跳转逻辑,这是最直接的解决方法。
- 在服务端配置HSTS响应头,告诉浏览器后续访问该域名时自动将所有HTTP请求升级为HTTPS,无需再向服务器发送HTTP请求触发跳转。修改后的Express代码如下:
const express = require("express"); var app = new express(); app.use(express.json()); // 新增HSTS配置,建议仅在GAE生产环境生效即可 app.use((req, res, next) => { if(process.env.NODE_ENV === 'production') { // max-age单位为秒,31536000对应1年有效期 res.setHeader('Strict-Transport-Security', 'max-age=31536000; includeSubDomains'); } next(); }); app.get("/", (req, res) => { setTimeout(() => { res.json({ finalResponse: 1 }); }, 5000); }); const PORT = process.env.PORT || 8000; app.listen(PORT, () => { console.log(`Server listening on port ${PORT}...`); });
你原本的app.yaml配置不需要修改,secure: always已经可以保证所有HTTP请求都会被强制跳转到HTTPS,配合以上两步就可以完全避免307重定向的两次请求问题。
注意:HSTS配置需要用户至少成功访问过一次HTTPS地址才会生效,首次访问如果是HTTP还是会触发一次跳转,之后就会自动升级为HTTPS
内容的提问来源于stack exchange,提问作者Manoj Sethi
相关产品推荐
相关产品推荐

