用 IIS 实现请求转发

最近部门要开发一个简单的APP,部分数据是现有项目已经存在的,为了方便维护,希望只提供一个交互的入口,并且协议的规则不变。

基于这个需求,有两套解决方案:

1.用代码将现有的api封装一层,对请求数据和返回数据不做任何改变,只是中转,然后和新的数据接口一起部署在一个项目里;

2.用IIS进行请求转发,调用现有接口回应请求,剩余部分开发新的api,部署在一个项目里,用URL Rewrite进行过滤分发。

第一个方案很传统,没什么好评价的,这里主要讲一下第二种方案的实现,第二个方案的好处是可以节省时间成本,需要依赖IIS插件(Application Request Routing + URL Rewrite)。

先下载ARR 和 URL Rewrite 进行安装,使用过程中发现ARR对IIS的“目录浏览”功能有依赖(未验证,如果无法使用,可以查看一下是否安装了“目录浏览”功能):

http://www.iis.net/downloads/microsoft/application-request-routing#additionalDownloads

http://www.iis.net/downloads/microsoft/url-rewrite#additionalDownloads

安装好插件,重新打开IIS

双击IIS根目录

双击Application Request Routing Cache

双击右边的 Server Proxy Settings

勾上 Enable proxy

点击“应用”后,新建一个站点,用来接受请求做转发

双击站点,双击 URL Rewrite -> Add Rules(新建规则) -> Blank rule(空白规则)

Name:填写你的规则名称

Match URL 是匹配Requested URL的规则

http://www.test.com?name=michael&age=30

host: www.test.com

requested url: ?name=michael&age=30

query string: name=michael&age=30

Requested URL 选择 Matches the Pattern (匹配符合规则的url)

Using 选择 Regular Expressions (使用正则表达式来匹配)

Pattern 里填写 ^(.*) 这里不对正则表达式做讲解,有需要的可以自己了解。

勾选 Ignore case 忽略大小写

展开 Conditions 条件筛选

Logical grouping 选择 Match Any

Match All 是列表中所有规则都要匹配才符合(与)

Match Any 是列表中有一个规则匹配就算符合(或)

track capture group across conditions 跟踪捕获组,这个功能跟正则有关,这里不需要不勾选,可以查询关键词 capture group  自行了解详情

点击 Add 添加条件

Condition input 填写  {HTTP_HOST}  ,HTTP_HOST 代表请求头里的host,就是上面例子里的 www.test.com 部分, 更多可过滤条件查询 Server Variables  自行了解

Check if input string 选择 Matches the Pattern

Pattern 填写 ^arrtest.com$  ,这里的意思是如果host是 arrtest.com 则匹配通过例:http://arrtest.com?asdf=1234

如果这里填写的是 ^www.arrtest.com$  ,则匹配 http://www.arrtest.com?asdf=1234

勾选 Ignore case 忽略大小写

双击展开 Action 部分

Action type 选择 Rewrite 重写转发

Rewrite URL 里填写 https://cn.bing.com/{R:1} 转发目标地址 {R:1} 代表 Match URL 部分匹配到的 Request URL

勾选 Append query string 追加查询字符串

到此配置结束,保存这个规则,在浏览器访问 http://arrtest.com/search?q=测试 就等同于访问 https://cn.bing.com/search?q=测试

为了防止该站点下的其他接口被这个规则无脑转发,我们需要新增一个转发条件

现有的需要转发的 API 格式如下 http://arrtest.com?PROTOID=123456

其他接口是没有 PROTOID 这个关键词的,并且 PROTOID 后面的value都是数字,那么这里就用这个关键词来过滤需要转发的请求

再回到刚刚的 Conditions 部分,点 Add 新增条件

Condition input 填写 {QUERY_STRING}

Check if input string 选择 Matches the Pattern

Pattern 填写 PROTOID=\d+ 这个规则的意思是,匹配查询字符串为 PROTOID 开头参数值为数字的请求(例:http://arrtest.com/?PROTOID=456789)

勾选 Ignore case 忽略大小写

确定保存,修改 匹配逻辑为 Match All (与),列表内所有的规则都匹配,请求才会通过

现在只有 QueryString 为 PROTOID 开头参数值为数字的请求才会被转发了

例子:http://arrtest.com/search?PROTOID=4564&q=测试   =>   http://cn.bing.com/search?PROTOID=4564&q=测试

http://arrtest.com/search?q=测试&PROTOID=4564  则不会被转发

至此请求转发的功能就实现了,除此之外,强大的 ARR + URL Rewrite 还可以实现高可用负载均衡。

时间: 2024-11-05 18:42:19

用 IIS 实现请求转发的相关文章

利用IIS应用请求转发ARR实现IIS和tomcat整合共用80端口

现在网上流传的实现iis和tomcat共享80端口的方法是基于isapi_redirect插件实现的, 我的实现方法不同, 原理相似,具有更好的优点. 先说下基于isapi_redirect缺点,java 项目作为iis下的一个虚拟目录存在, iis下的项目使用顶级域名, tomcat下的项目只能作为二级目录访问; 例如iis下项目 使用www.iisproject.com访问, 则tomcat下的项目只能 www.iisproject.com/tomcatproject 这么访问, 如此变得不

jsp学习之——关于请求转发和重定向的形象理解

1.重定向:是属于客户端行为,实现方法:response.sendRedirect() 从本质上讲等同于两次请求,前一次的请求对象不会保留,在浏览器上的直观表现是--地址栏的URL地址会改变. 2.请求转发:是属于服务器行为,实现方法:request.getRequsetDispatcher().forward(requset,response) 是一次请求,转发后请求对象会保存,浏览器上的直观表现就是--地址栏的URL地址不会改变.(服务器内部转发,所以客户端看不到地址栏的改变) 下面举个生活

举例说明重定向和请求转发的区别

重定向 HttpServletResponse对象的sendRedirect(java.lang.String location)方法称作重定向. 如果location地址前面加上“/”,则表示相对于Servlet容器的根来请求,比如http://localhost:8080:如果location地址前面没有加上“/”,则表示相对于当前请求的URI来寻找地址. 请求转发 RequestDispatcher的:forward(ServletRequest request, ServletRespo

使用iptables配置linux服务器请求转发

1首先把/etc/sysctl.conf配置文件中的net.ipv4.ip_forward=0改为net.ipv4.ip_forward=1 然后执行sysctl -p /etc/sysctl.conf使命令生效. 2配置防火墙的 IP 伪装 iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE 3如果你想让内部网络内的某个服务器能够被外部访问,你可以使用 NAT 内 PREROUTING 链的 -j DNAT 目标来指定向目标 IP 地址以及

请求转发与请求重定向

----请求重定向:客户端行为,response.sendRedirect(); 从本质上讲等同于两次请求,前一次的请求对象不会保存,地址栏的URL地址会改变. ----请求转发:服务器行为,request.getRequestDispatcher().forward(req,resp); 其本质是一次请求,转发后请求对象会保存在request中,地址栏URL地址不会改变.

【Servlet】深入浅出Java重定向和请求转发

import java.text.*; import java.util.*; import java.io.*; import javax.servlet.http.*; import javax.servlet.*; import com.bjpowernode.exam.model.*; import com.bjpowernode.exam.manager.*; public class SearchStudentServlet extends HttpServlet { public

HTTP中的重定向和请求转发的区别

一.调用方式 我们知道,在servlet中调用转发.重定向的语句如下: request.getRequestDispatcher("new.jsp").forward(request, response);   //转发到new.jsp response.sendRedirect("new.jsp");   //重定向到new.jsp 在jsp页面中你也会看到通过下面的方式实现转发: <jsp:forward page="apage.jsp"

JavaWeb_请求转发与重定向

1.主题 RequestDispather 请求转发接口. sendRedirect()重定向方法. 核心代码1 RequestDispather requestDispather = request.getRequestDispather("/"+path); requestDispather.forward(request,response); 核心代码2 response.sendRedirect(path) 请求地址栏不变,重定向地址栏变化. 请求保留request,重定向不保

请求重定向和请求转发的区别

1)转发只能将请求给同一个WEB应用中的组件:重定向可以重定向到一个站点上的其它应用程序的资源,还可以使用绝对URL重定向到其它站点的资源. 2)重定向需要的路径是针对浏览器的,也就是说相对URL以"/"开头,它是相对于整个WEB站点的根目录:转发需要的路径是相对于服务器的,也就是说相对URL以"/"开头,它是相对于当前WEB应用程序的根目录. 3)重定向浏览器地址栏发生变化:转发浏览器地址栏不发生变化.这是因为重定向对浏览器的请求直接作出响应,然后让浏览器去访问它