使用IIS ARR代理时仅出现HTTP 401错误的技术问询
解决IIS反向代理域名访问时401权限错误的问题
嘿,我之前处理过几乎一模一样的场景!你遇到的这个401错误,核心原因就是反向代理过程中没把客户端的身份验证信息正确传递给后端应用,再加上现有重写规则里的几个小疏漏,导致用域名访问时后端不认这个请求。
咱们一步步来调整:
1. 补全代理请求头的传递
后端应用大概率依赖Authorization头来验证请求合法性,但默认情况下IIS的ARR不会自动传递这个头,而且咱们得先在ARR里开权限允许修改这些服务器变量。
步骤一:配置ARR允许修改服务器变量
打开IIS管理器 → 选中服务器节点 → 找到「应用程序请求路由缓存」→ 点击「服务器代理设置」→ 先勾选「启用代理」,然后点「服务器变量」按钮,把HTTP_AUTHORIZATION和HTTP_X_FORWARDED_FOR添加到允许修改的列表里(后者用来保留客户端真实IP,可选但非常推荐)。
步骤二:修改入站重写规则
把你的入站规则里的<serverVariables>部分补全,加上传递身份验证头和客户端IP的设置:
<rule name="ReverseProxyInboundRule1" stopProcessing="true"> <match url="(.*)" /> <action type="Rewrite" url="http://localhost:33337/{R:1}" /> <serverVariables> <set name="HTTP_ACCEPT_ENCODING" value="" /> <!-- 新增这两行,传递身份验证头和客户端真实IP --> <set name="HTTP_AUTHORIZATION" value="{HTTP_AUTHORIZATION}" /> <set name="HTTP_X_FORWARDED_FOR" value="{REMOTE_ADDR}" /> </serverVariables> </rule>
2. 修正出站规则的域名匹配
我注意到你出站规则里写的是sub.domain.com,但你实际访问用的是domain.com,这会导致页面里的CSS、JS、图片等资源链接没被正确替换成域名,部分请求还是会指向localhost:33337,要么触发跨域要么引发权限问题。
同时建议把filterByTags扩展到Link, Script,确保所有资源链接都能被处理:
<rule name="ReverseProxyOutboundRule1" preCondition="ResponseIsHtml1"> <match filterByTags="A, Form, Img, Link, Script" pattern="^http(s)?://localhost:33337\/?(.*)" /> <!-- 把这里的sub.domain.com改成你实际用的domain.com --> <action type="Rewrite" value="http{R:1}://domain.com/{R:2}" /> </rule>
最后再检查两个关键点
- 确认后端应用的身份验证配置:如果后端用了Windows身份验证,得确保IIS站点也开启了Windows身份验证,并且应用程序池的身份有足够权限访问后端服务。
- 清空浏览器缓存再测试:有时候旧的缓存资源会干扰测试结果,清完缓存再用域名访问试试。
这个问题本质就是反向代理时的请求头完整性和资源地址替换的问题,调整完这两处应该就能解决401错误了。
内容的提问来源于stack exchange,提问作者Pie
相关产品推荐
相关产品推荐

