Azure App Service部署的Java应用公网访问HSTS头丢失求助
问题
我有一个部署为Azure App Service的Java 8 Spring Boot应用(内置Web服务器),可通过Azure App Service标准域名<myapp>.azurewebsites.net访问。应用会在HTTP响应中添加HSTS(Strict-Transport-Security)头,通过App Service SSH执行curl命令验证:访问http://0.0.0.0/test/debug可看到Strict-Transport-Security头及自定义X-Custom-Header头。但通过<myapp>.azurewebsites.net公网域名访问时,Strict-Transport-Security头丢失,仅能看到X-Custom-Header等其他头。现咨询:如何让通过公网<myapp>.azurewebsites.net域名访问App Service API时,响应中包含Strict-Transport-Security头?
附调试用JAX-RS控制器代码:
import javax.ws.rs.* import javax.ws.rs.core.MediaType import javax.ws.rs.core.Response @Path("/test") class DebugResource { @GET @Path("/debug") @Produces(MediaType.APPLICATION_JSON) fun debug(): Response { return Response.ok("test") .header("Strict-Transport-Security", "max-age=31536000") .header("X-Custom-Header", "custom-value") .build() } }
解决方案
核心原因
Azure App Service的前端负载均衡器(ARR)会过滤HTTP请求返回的Strict-Transport-Security头,仅保留HTTPS请求返回的该头并转发给客户端。公网访问时如果走HTTP协议,头会被直接丢弃;即使走HTTPS,也可能需要额外配置确保头不被拦截。
具体解决方法
- 开启强制HTTPS:在Azure门户进入你的App Service,依次点击「设置」→「TLS/SSL设置」,开启「强制HTTPS」选项,确保所有公网请求都通过HTTPS访问。
- 在App Service层面配置HSTS头:直接通过平台配置添加头,绕过应用代码的限制。操作路径:Azure门户→你的App Service→「设置」→「配置」→「通用设置」,在「自定义头」区域添加键为
Strict-Transport-Security,值为max-age=31536000; includeSubDomains(可根据需求调整参数)。 - 验证生效情况:配置完成后,执行
curl -I https://<myapp>.azurewebsites.net/test/debug命令,检查响应头中是否存在Strict-Transport-Security。
代码层面补充调整(可选)
如果希望通过应用代码返回HSTS头,需做以下配置:
- 让Spring Boot识别前端的HTTPS协议:在
application.properties中添加server.tomcat.remoteip.protocol-header=x-forwarded-proto,因为App Service前端会处理SSL,应用内部实际接收的是HTTP请求。 - 仅在HTTPS请求时添加HSTS头:修改控制器代码,判断请求协议后再添加头,避免HTTP请求返回的头被ARR过滤。
内容的提问来源于stack exchange,提问作者Rames
相关产品推荐
相关产品推荐

