Play Framework Scala配置HSTS后,Postman无法查看响应头参数?
解决Play Framework中HSTS响应头不显示的问题
我之前在Play 2.8+版本里也碰到过一模一样的问题,咱们一步步排查和解决:
1. 修正HSTS配置路径(最常见的错误)
你当前把HSTS配置写在了play.filters.https.strictTransportSecurity,但Play的SecurityHeadersFilter对应的HSTS配置是在play.filters.headers节点下的!这是核心问题,把配置改成:
play.filters.enabled += "play.filters.headers.SecurityHeadersFilter" play.filters.headers.frameOptions = "DENY" play.filters.headers.strictTransportSecurity = "max-age=31536000; includeSubDomains; preload"
2. 确认请求确实走HTTPS且Play识别到
如果你的Play服务器前面有反向代理(比如Nginx、Apache),即使外部访问是HTTPS,代理和Play之间可能用的是HTTP,这时候Play会认为请求是HTTP的,不会返回HSTS头(HSTS仅在HTTPS响应中发送)。
解决办法是让Play信任代理的转发头:
# 生产环境建议指定具体的代理IP段,这里为了测试暂时信任所有代理 play.http.forwarded.trustedProxies = ["0.0.0.0/0"]
同时要确保反向代理给Play传递了X-Forwarded-Proto: https请求头。
3. 验证过滤器是否正确加载
- 检查
application.conf里的play.filters.enabled有没有被其他环境配置(比如application-prod.conf)覆盖 - Play 2.6+默认已经启用
SecurityHeadersFilter,但显式添加配置可以确保它不会被自定义过滤器链排除
4. 用更可靠的工具测试(避免Postman缓存)
Postman有时候会缓存响应头,导致看不到最新的变化。建议用curl命令直接测试原始响应:
curl -v https://www.mywebsite.com
在输出的响应头区块里查找strict-transport-security字段。
5. 排查自定义代码的干扰
检查你的Scala代码里有没有自定义的Action或者过滤器,是否在响应中移除或修改了strict-transport-security头。比如有没有类似这样的代码:
Action { request => Ok("Hello").withHeaders(/* 可能覆盖或移除HSTS头的逻辑 */) }
如果有,需要调整代码确保不会影响HSTS头的正常返回。
内容的提问来源于stack exchange,提问作者AKDGP
相关产品推荐
相关产品推荐

