之前在我写的一篇关于URL重写模块的文章中,看到评论有咨询这样的一个问题:想要实现访问A站点的API,让B站点的API响应,并且是以HTTP POST请求的形式,但是设置rewrite不起作用,依然是A站点的API响应,如果使用redirect的方式,会以GET方式访问B站点API并返回404。要想实现不同站点之间的POST请求重写,最主要的技术点有两个,一个是服务器级别的URL重写,另一个是用ARR做反向代理。
PS:本文需要对ARR有一定的基础了解,ARR全称Application Request Routing,应用程序请求路由,建议先查阅官方文档,使用ARR一些需要注意的地方可以参考我之前的文章:总结IIS中使用ARR一些要注意的地方和经验。
由于ARR是基于URL重写模块的,只要之前对URL重写有所了解上手并不会太难,除非你需要使用更加高级的功能,比如实现负载均衡方案之类的。
先说一个要注意的地方,使用网站级别的URL重写是无法实现本文提到的效果的,一定要服务器级别的URL重写,搭配ARR来做。毕竟网站级别的URL重写是不支持跨域和跨IP重写,类似跨域或者绝对路径的处理网站级别的只能做重定向,但是重定向POST提交的数据会丢失并转换为GET请求。
接下来说说可以实现的几种场景:
- 如果两个网站/API在同个服务器上,并且主机名不一样,都可以实现。具体主机名不一样有这几种情况:
- 绑定了不同的域名
- IP地址相同端口号不同
- IP地址不相同
- 如果两个API网站分别部署在不同服务器就比较麻烦了,需要利用Server Farms,具体需要使用ARR比较高级的功能,有需要的只能自己先研究下,大体思路还是差不多的。
这里先假设下场景,假设有两个API网站,IP地址都是192.168.1.111,但是A站点的端口号为811,测试的API路由为"api/products",B站点的端口号为812,测试的API路由为"api/newproducts"。现在要将A站点API的POST请求,重写到B网站并让B网站响应,只需要设置下服务器级别的重写规则即可。
首先打开IIS管理器,选择服务器的根节点:
接着在右侧管理面板中打开URL重写,并添加一条新的空白规则,然后设置A站点匹配URL的模式为:api/products。
接下来继续设置条件规则,这里一定要注意设置,特别是{REQUEST_METHOD}这个服务器变量要限制只处理POST请求,防止与GET请求冲突。剩下的条件输入过滤根据自己的情况来,如果主机头是域名或IP不同只要设置{HTTP_HOST}就可以了,如果像我上面例子中的情况,还要要设置{SERVER_PORT}来过滤端口。
最后设置下重写操作,指定要重写的URL:
到了这一步就实现了http://192.168.1.111:811/api/products的POST请求让http://192.168.1.111:812/api/newproducts来响应!
有条件的可以部署两个不同域名的网站(或者修改本地hosts搞2个域名来测试),这里只是简单用不同的端口作为演示,总体实现的思路也是差不多的。如果两个API网站域名不同,在条件规则那{HTTP_HOST}就可以直接设置域名:
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/98916.html