IIS中使用URL Rewrite时物理路径错误问题求助
解决IIS反向代理映射localhost/mysite到localhost:81的404问题
一、先把URL Rewrite规则搞对
首先得确认你的重写规则是代理类型,别搞成普通的重定向或者路径重写——很多人栽在这,导致IIS还是死磕本地物理路径。
- 打开IIS管理器,找到绑定localhost的默认站点,进入URL Rewrite
- 查看你创建的规则,Action类型必须是
Rewrite,还要勾选Append query string - 关键的Rewrite URL要设成
http://localhost:81{R:0}(如果匹配模式是^mysite(.*),就用http://localhost:81/{R:1},根据你的匹配规则调整) - 规则必须添加在**默认站点(C:\inetpub\wwwroot)**下面,别加到mysite的子站点里——你根本没建这个子站点,只是想通过路径代理而已
二、再核实ARR代理真的启用了
虽说你说已启用,但得确认这几点:
- 点击IIS最顶部的服务器节点,进入Application Request Routing Cache
- 点击右侧的Server Proxy Settings,确保Enable proxy是勾选状态
- 顺便把Reverse rewrite host in response headers也勾选上——要是你的ASP.NET Core站点有跳转,这个选项能修正跳转路径,避免跳错地址
三、先搞定Failed Request Tracing无输出的问题
这个工具能帮你看清请求到底在哪卡壳,必须先弄好:
- 打开默认站点的功能视图,找到Failed Request Tracing Rules
- 点击右侧**Add...**创建新规则:
- 勾选所有内容类型,状态代码填
404 - 勾选URL Rewrite和ASP.NET等相关提供程序
- 确保
C:\inetpub\logs\FailedReqLogFiles目录给IIS_IUSRS和NETWORK SERVICE添加了读写权限
- 勾选所有内容类型,状态代码填
- 重启默认站点和IIS服务,再访问localhost/mysite,查看日志是否生成
四、避免虚拟目录/子站点冲突
别在默认站点下创建名为mysite的虚拟目录或子站点,否则IIS会优先查找这个目录的物理路径,根本不走代理规则。之前建过的话直接删除即可。
五、直接修改web.config确保规则生效
要是IIS界面配置的规则没起作用,直接编辑默认站点根目录的web.config,替换成以下内容(按需调整):
<?xml version="1.0" encoding="UTF-8"?> <configuration> <system.webServer> <rewrite> <rules> <rule name="Proxy to mysite" stopProcessing="true"> <match url="^mysite(.*)" /> <action type="Rewrite" url="http://localhost:81{R:1}" /> <serverVariables> <set name="HTTP_X_ORIGINAL_ACCEPT_ENCODING" value="{HTTP_ACCEPT_ENCODING}" /> <set name="HTTP_ACCEPT_ENCODING" value="" /> </serverVariables> </rule> </rules> <outboundRules> <rule name="Restore Accept Encoding" preCondition="NeedsRestoringAcceptEncoding"> <match serverVariable="HTTP_ACCEPT_ENCODING" pattern="^(.*)" /> <action type="Rewrite" value="{HTTP_X_ORIGINAL_ACCEPT_ENCODING}" /> </rule> <preConditions> <preCondition name="NeedsRestoringAcceptEncoding"> <add input="{HTTP_X_ORIGINAL_ACCEPT_ENCODING}" pattern=".+" /> </preCondition> </preConditions> </outboundRules> </rewrite> <urlCompression doStaticCompression="false" doDynamicCompression="false" /> </system.webServer> </configuration>
这段配置能处理编码问题,避免代理后内容压缩异常,同时确保规则正确指向81端口的站点。
六、最后确认ASP.NET Core站点的配置
虽说你说localhost:81能访问,但还是得核对下:
- 你的ASP.NET Core站点在IIS里的绑定是
localhost:81,物理路径是C:\Websites\mysite - 站点的应用程序池要设成无托管代码(毕竟是.NET Core站点)
- 应用程序池的身份要有
C:\Websites\mysite的读写权限
全部设置完成后重启IIS服务,再访问localhost/mysite应该就能正常代理了。
内容的提问来源于stack exchange,提问作者Chau
相关产品推荐
相关产品推荐

