IIS重写规则搭配Tomcat 9.0:后续请求跳转至8080端口求助
跳转暴露8080端口的核心原因是Spring Boot应用未感知到自身处于IIS反向代理之后。当应用生成跳转链接(如重定向、页面资源链接)时,会基于自身Tomcat服务的8080端口构建URL,而非用户实际访问的IIS 80端口。直接用java -jar运行时无此问题,是因为应用直接接收用户请求,能获取正确的请求上下文;但通过IIS代理后,应用收到的是来自IIS的内部请求,端口为8080,因此生成的链接会带上该端口。
解决方案1:完善IIS重写规则,传递代理请求头
修改现有IIS重写规则,添加请求头传递逻辑,将外部请求的主机、端口信息传给Tomcat:
<rule name="app" enabled="true" stopProcessing="false"> <match url="^app.*" /> <serverVariables> <set name="HTTP_X_FORWARDED_HOST" value="{HTTP_HOST}" /> <set name="HTTP_X_FORWARDED_PORT" value="80" /> <set name="HTTP_X_FORWARDED_PROTO" value="http" /> </serverVariables> <action type="Rewrite" url="http://server-name:8080/{R:0}" logRewriteUrl="true" /> </rule>
注意:需在IIS「URL重写」模块的「视图服务器变量」中,添加
HTTP_X_FORWARDED_HOST、HTTP_X_FORWARDED_PORT、HTTP_X_FORWARDED_PROTO这三个变量,否则IIS会拒绝设置。
解决方案2:配置Spring Boot识别代理头
在application.properties中添加以下配置,让应用读取IIS传递的代理头,生成正确的外部URL:
# 启用转发头处理(Spring Boot 2.2+版本) server.forward-headers-strategy=native # 配置信任的代理服务器(同一机器填localhost或IIS内网IP) server.tomcat.remoteip.remote-ip-header=x-forwarded-for server.tomcat.remoteip.protocol-header=x-forwarded-proto server.tomcat.remoteip.host-header=x-forwarded-host
若使用Spring Boot 2.2之前版本,将
server.forward-headers-strategy=native替换为server.use-forward-headers=true
额外验证
确保应用内生成链接时,基于HttpServletRequest上下文构建,而非硬编码端口。例如使用response.sendRedirect("/app/some-path"),而非response.sendRedirect("http://server-name:8080/app/some-path")。
内容的提问来源于stack exchange,提问作者Vinu Pillai

