-
Notifications
You must be signed in to change notification settings - Fork 6
IIS URL重写至http(s)全部404,其余情况正常 #135
Description
解决过程
在准备把 Node.js 后端程序从阿里云的 CentOS 服务器往 Windows 服务器上迁移的过程中,发现用 IIS 将请求重写至 Windows 服务器上的 http://localhost:3002/ 这样的地址时,所有重写请求都报 404 错误。
经过排查,发现重写至 http(s) 的规则全部 404,重定向至 http(s) 的规则全部正常,另外重写至相对路径的规则也全部正常。
于是搜索该问题,Stack Overflow 上的这篇问答 IIS Rewrite not working (but redirection does),下面有人说需要在 IIS 中安装 ARR 这个扩展。想起来之前服务器上的确安装了 ARR,可能就是这个原因,导致之前的重写规则没问题,现在就不行了。
在给服务器的三块磁盘都创建了手动快照之后,就开始安装ARR。在IIS管理器中,打开Web平台安装程序,搜索ARR,显示三个版本的“应用程序请求路由”,版本分别是2.5(KB2589179)、2.5(英语)、3.0 Beta(英语),中文的用起来还是方便,那就安装2.5(KB2589179)。
安装完毕后,提示产品“应用程序请求路由2.5(KB2589179)”安装失败,但是“External Cache 1.0”、“Web Farm Framework 1.1”和“应用程序请求路由2.5”这三款产品安装成功。
查看IIS根节点,没有找到安装的ARR,于是关闭IIS管理器再重新打开,这时候在IIS根节点找到了“Application Request Routing Cache”这个模块,发现这个模块还是英文的,那就这么用吧。
双击打开这个模块,点击右侧的“Server Proxy Settings”,选中“Enable Proxy”,同时取消选中“Reverse rewrite host in response headers”。
应用设置之后,检查各个网站,新蓝题库之外的功能测试了一遍,都是正常的,那就OK。
然后在具体的网站下创建 URL 重写规则,将域名之后 v2/ 开头的请求,重写到 http://localhost:3002/ ,结果发现在浏览器里打开依然报 404,这是什么情况?于是 Google “IIS 配置 ARR”,第一篇文章也是在各个网站下配置具体的 URL 重写规则的,忽然想到是不是可以在根节点下配置 URL 重写规则?于是照着试了一下,果然可以了!虽然不知道是什么原因,不过至少把问题解决了,可以可以。
那以后需要把各网站的请求重写到本地的 http 服务上的话,就都在 IIS 的根节点下配置 URL 重写就行,只需要在每个 URL 重写规则里,在“条件”部分,将 {HTTP_HOST} 属性设置为需要重写的域名,比如 ^www.abc.com$ 这样。