IIS7向另一服务器的Nginx重定向/转发请求的配置问题
看起来你遇到的问题主要来自两个关键细节:请求转发时的Host头不匹配,以及IIS规则的URL匹配可能和实际需求不符,我来一步步帮你排查和解决:
1. 核心问题:Nginx的Host头匹配失败
你现在能看到默认的Nginx欢迎页面,说明IIS确实把请求转发到了Nginx服务器,但Nginx没有匹配到你配置的dept.company.com server块,而是走了默认的server(因为请求的Host头不对)。
原因很简单:IIS默认转发请求到5.6.7.8时,请求的Host头是5.6.7.8,而你的Nginx server块只监听dept.company.com这个Host,所以Nginx会自动匹配到安装时自带的默认server,显示默认欢迎页。
解决方法二选一:
方法A:让IIS转发时保留原Host头
修改IIS重写规则的action部分,加上preserveHostHeader="true",这样转发到Nginx的请求会保留原Hostdept.company.com,Nginx就能精准匹配到你配置的server块:
<rule name="RewriteAppToNginx" stopProcessing="true"> <match url="^app/(.*)" /> <conditions logicalGrouping="MatchAll"> <add input="{HTTP_HOST}" pattern="dept.company.com" /> </conditions> <!-- 新增preserveHostHeader参数,保留原Host头 --> <action type="Rewrite" url="http://5.6.7.8/{R:1}" preserveHostHeader="true" /> </rule>
方法B:修改Nginx的server_name,兼容IP
如果不想改动IIS的Host头设置,可以在Nginx的server块里把5.6.7.8也加到server_name里,这样不管请求Host是域名还是IP,都会匹配到你配置的server块:
server { listen 80; listen [::]:80; root /var/www/dept.company.com/html; index index.html index.htm index.nginx-debian.html; # 新增服务器IP作为监听的Host server_name dept.company.com 5.6.7.8; location / { try_files $uri $uri/ =404; } }
修改完Nginx配置后,记得执行sudo nginx -s reload让配置生效。
2. 检查IIS规则的URL匹配是否符合需求
你在问题里说要转发dept.company.com/app-1的请求,但当前IIS规则的match url是^app/(.*)——这个规则只能匹配以app/开头的路径(比如dept.company.com/app/xxx),完全无法匹配app-1(没有斜杠)。
如果你的实际需求是转发/app-1下的所有请求,需要把match url改成:
<match url="^app-1/(.*)" />
如果是要匹配所有以app开头的路径(比如app-1、app-2、app/xxx),可以调整为^app.*(.*)。
3. 最后验证步骤
- 确保IIS的URL重写模块已经正确安装(如果没装,规则根本不会生效)
- 重启IIS站点,让修改后的规则生效
- 在Nginx服务器的
/var/www/dept.company.com/html下放一个测试文件,比如test.html - 访问
dept.company.com/app-1/test.html(对应你的规则路径),看是否能正常加载Nginx上的测试文件
如果还是有问题,可以查这两个地方:
- 网络连通性:在IIS服务器上用
curl http://5.6.7.8/test.html测试,确认能直接访问Nginx的文件 - Nginx日志:查看
/var/log/nginx/access.log和error.log,看请求的Host头和路径是什么,快速定位问题
备注:内容来源于stack exchange,提问作者Amruth Kiran

