之前在我写的一篇关于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地址都是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}就可以直接设置域名:
作者:十有三
出处:https://shiyousan.com/post/636204388373544350
版权声明:本文采用知识共享许可协议:署名-相同方式共享 4.0 国际(CC BY-SA 4.0)。欢迎转载本文,转载请声明出处或保留此段声明。