概观

IIS URL重写2.1使Web管理员能够创建强大的规则来实现更容易让用户记住的网址,并使搜索引擎更容易找到。通过使用规则模板,重写映射,.NET提供程序和集成到IIS管理器中的其他功能,Web管理员可以轻松设置规则来定义基于HTTP标头,HTTP响应或请求标头,IIS服务器变量甚至复杂的URL重写行为程序规则。此外,Web管理员可以执行重定向,发送自定义响应,或基于重写规则中表达的逻辑来停止HTTP请求。

定义强大的规则来将复杂的URL转换成简单和一致的Web地址

URL Rewrite允许Web管理员使用.NET编写的重写提供程序,正则表达式模式匹配和通配符映射轻松构建功能强大的规则,以检查URL和其他HTTP标头和IIS服务器变量中的信息。可以编写规则来生成用户可以更容易记住的URL,搜索引擎很容易编制索引,并允许URL遵循一致且规范的主机名格式。URL重写进一步简化了规则创建过程,支持内容重写,规则模板,重写映射,规则验证以及现有mod_rewrite规则的导入。

轻松替换Web应用程序URL以生成用户和搜索引擎友好的结果

URL重写允许Web管理员轻松地将响应HTML中的Web应用程序生成的URL替换为更友好的用户友好的和搜索引擎友好的等价物。可以在逆向代理背后的Web应用程序生成的HTML标记中修改链接。URL重写使出站响应内容和头部重写变得更容易,出站重写规则可以与HTTP请求和响应头以及IIS服务器变量一起工作。

与现有IIS功能无缝集成,可改善管理,性能和故障排除

URL重写与IIS管理器紧密集成以更好地管理。此外,URL Rewrite支持用户模式和内核模式缓存,以提高性能。URL重写还支持失败的请求跟踪,以增强对应用程序逻辑执行的故障排除。

特征

  • 基于规则的URL重写引擎
  • 基于规则的响应重写引擎
  • 支持自定义的.NET重写提供程序
  • 正则表达式模式匹配
  • 通配符模式匹配
  • 全局和分布式重写规则
  • 在特定HTML标记的内容中重写
  • 出站规则的前提条件
  • 访问服务器变量和HTTP头
  • 重写服务器变量和HTTP请求头
  • 重写HTTP响应头
  • 允许列表服务器变量
  • HtmlEncode函数
  • 内置的规则模板
  • 反向代理规则模板
  • 搜索引擎优化的规则模板
  • 各种规则操作,包括重定向和请求中止
  • 在规则条件下跟踪捕获组
  • 记录重写的URL
  • 在IIS管理器中更新了用户界面
  • 用于管理重写规则和重写地图的集成用户界面
  • 用于导入Apache mod_rewrite规则的集成用户界面
  • 用于测试正则表达式和通配符模式的集成用户界面
  • 支持IIS内核模式和用户模式输出缓存
  • 小写转换功能
  • 重写映射以在重写期间生成替换URL
  • 失败的请求追踪支持

奖项

下载URL重写模块2.1

下载可扩展性示例

可扩展性示例为.NET程序集提供了完整的重写提供程序的源代码,这三种最常见的用例是:将重写或重定向映射存储在SQL数据库中; 将重写或重定向映射存储在文本文件中; 将查找子字符串存储在文本文件中。

下载示例

 

相关学习

用品

论坛

视频

IIS团队刚刚发布了URL Rewrite v2.1。以下博客文章详细介绍了此版本中引入的更改。您可以从https://www.iis.net/downloads/microsoft/url-rewrite或从WebPI 下载最新版本。

控制URL重写规则的响应缓存能力

URL Rewrite v7.1.1909从可缓存的服务器变量集中移除了“HTTP_HOST”。这意味着任何在条件中引用“HTTP_HOST”的URL重写规则或者其操作是重写/重定向并将“HTTP_HOST”设置为其操作的一部分的URL重写规则不再是内核可缓存的。此修复的目的是防止由于缓存导致客户被困在重写循环中,因为URL Rewrite无法检测循环。但是,此更新消除了客户如果知道他们没有任何重定向循环,则允许其响应成为内核可缓存的能力。

引入一个responseCacheDirective

通过
在规则元素responseCacheDirective上引入新的指令,URL重写规则可明确标记为可缓存。

responseCacheDirective接受四个可能的值:

1. 始终:响应始终可缓存。
2. 从不:响应永远不可缓存
3. NotIfRuleMatched:如果规则匹配,则响应不可缓存。
4. 自动(默认):URL重写根据规则中使用的服务器变量来确定规则的缓存友好性。

进入重定向循环的风险尚未缓解,因此设置responseCacheDirective始终只使用时可以验证有没有重定向循环。

当你使用不同的responseCacheDirective定义多个规则时会发生什么?

URL重写会尝试将传入的URL顺序匹配到一组规则。每个规则有三种可能的结果,因为它适用于传入的URL:不匹配,URL匹配和规则匹配,以增加匹配度。匹配的规则与匹配的URL不同,除了匹配的URL之外还满足规则条件。

每个规则都会重新考虑响应的可缓存性,初始状态是一个中性状态,URL重写不会以任何方式指示内核缓存。如果当前状态变为不可缓存,则不考虑进一步的规则来确定缓存能力。换句话说,执行的所有规则中的单个规则足以使整个响应不可缓存。这使得规则的排序很重要在发生“规则匹配”时停止处理的情况。考虑至少有一个规则评估为“URL匹配”,并且该规则被设置为“从不”或“自动”且缓存不友好的服务器的情况。如果这个规则是在规则匹配之前的顺序,那么它会导致内核缓存被禁用。另一方面,如果规则在“规则匹配”规则之后被跳过,则对缓存能力没有影响。

对于一个对缓存能力有影响的规则,规则至少应该是“URL匹配”。如果为给定规则的responseCacheDirective选择了“NotIfRuleMatched” ,则整个规则与URL和条件匹配时,该响应的内核缓存将被禁用。请记住,“NotIfRuleMatched”不考虑缓存不友好的服务器变量。对于“ 永不”和“ 永远”也是如此,只有在存在缓存不友好的服务器变量导致内核缓存被禁用的情况下,Auto才是唯一的值。

保留原始网址编码

在V7.1.1980之前的URL Rewrite版本中,当试图使用UNENCODED_URL时,URL Rewrite将对其进行编码,如果原始URL已经被编码,则可能导致双重编码。这违反了RFC3986第2.4 ,其中规定“ 实现必须不是百分比 - 不止一次地编码或解码相同的字符串,因为解码已经解码的字符串可能导致错误地解释百分比数据八位组作为百分比编码的开始,反之亦然百分比编码已经百分比的编码 - 编码的字符串“。这也使得UNENCODED_URL的使用变得不切实际,特别是在ARR的反向转发器场景中,后端服务器期望URL不被修改地传递。

在v7.1.1980中,我们添加了一个功能标志useOriginalURLEncoding,允许您在设置为true时关闭此不符合的URL编码。默认行为将保持不变(useOriginalURLEncoding默认为true)。

为了进一步解释这一点,我们来看下面的例子,输入的URL是https://contoso.com/ab%2fde/。在这个例子中,从IIS.SYS接收到的URL 的熟化表示是一旦解码/ ab / de /的URL 。

当保留原始URL编码(useOriginalURLEncoding == true)时,UNENCODED_URL服务器变量通过对传入URL进行编码来计算,这导致双重编码ab%252f。关闭不符合规定的行为(useOriginalURLEncoding = false)后,UNENCODED_URL现在只是传入的URL。

使用URL重写的更常见的方式是后向引用,其中{R:0}表示与规则匹配的URL的整个部分,{R:n}表示与特定部分匹配的URL部分正则表达式用括号括起来。如果RE中有多个部分用括号括起来,n表示RE 中使用的1 <= n <=#个括号对的顺序。

通过对熟化URL的相应​​部分进行编码来计算得到的反向引用。但是,由于我们正在编码熟化的URL,所以不可能确定原始URL中是否存在“ /”  ,或者是第一次解码的人工产物,因此我们不会尝试对其进行编码。在将useOriginalURLEncoding设置为false之后,反向引用现在只是熟化的URL。

原始网址:https://contoso.com/ab%2fde/

重写规则包含 useOriginalURLEncoding =真 useOriginalEncoding = FALSE
BACK_REFERENCE / AB /德/ / AB /德/
UNENCODED_URL / AB%252fde / / AB%2fde /

我们来看看传入URL已经被双重编码的另一个例子:http//contoso.com/ab%2520de/。在这个例子中,IIS从HTTP.SYS接收到的* cooked *表示是一次被解码的URL / ab%20de /

当保留原始URL编码时,UNENCODED_URL服务器变量再次通过对熟化的URL进行编码来计算。关闭不符合规定的行为后,UNENCODED_URL仍然是原始网址。

反向引用是通过对熟化的URL进行编码来计算的。在将useOriginalURLEncoding设置为false之后,URL服务器变量现在就是熟化的 URL。

重写规则包含 useOriginalURLEncoding =真 useOriginalURLEncoding = FALSE
BACK_REFERENCE / AB%2520de / / AB%20de /
UNENCODED_URL / AB%252520de / / AB%2520de /

在这两个示例中,useOriginalURLEncoding = false提供了一种通过使用UNENCODED_URL未修改原始URL的方法。这通常是反向代理场景中的预期结果。它也消除了URL重写模块所执行的任何双重编码。

7评论

  • 很高兴看到IIS团队不睡觉,并在URL重写模块上工作。对于更多新的改进和功能,您可以从UrlRewrite.Net模块获得启发:https://github.com/Bikeman868/UrlRewrite.Net

    Be3CH -2017年6月30日星期五上午6点03分39秒

  • 我已经通过它实现了ARR访问SAP fiori门户,我已经成功打开页面并登录,但登录后出现“无法加载组”的错误。我已经按照他们打开了SAP的案例。

    原因

    您正在使用第三方代理,如Microsoft IIS,Microsoft UAG,Apache等

    。反向代理在将请求转发到后端之前会自动解码整个URL。'%2F'被

    解码为'/'。

    解决方案
    配置您的代理服务器以确保它将传递未解码的请求URL。

    注意:我遵循你的指令,升级rewirte 2.0并配置条件{encode_url}模式(。*),但没有正面结果,所以请协助我如何配置代理服务器传递URL未解码。您的及时响应请求

    马利克 -2017年7月10日星期一上午06:35:33

  • 从FailedReqLog文件记录日志:

    )URL_REWRITE_END重写{0469ABFA-1BB2-466A-B645-E3E15A02F38B} 0 1 4 55 0x0 RPROXY {80000019-0001-FC00-B63F-84710C7967BB} 202.125.137.133 49299 202.125.137.133 443 GENERAL_ENDPOINT_INFORMATION {D42CF7EF-DE92-473E-8B6C-621EA663113A } 0 1 4 50 0x0 RPROXY {80000019-0001-FC00-B63F-84710C7967BB}连接:Keep-Alive接受:application / json Accept-Encoding:gzip,deflate Accept-Language:en Cookie:sap-usercontext = sap-language = EN&汁液客户= 950; SAP_SESSIONID_GWA_950 = xB0yA-wrScKXERgtrqXQpCqmSUNlPBHnkkYADCmrLiA%3D; 0 false GENERAL_SET_RESPONSE_HEADER {D42CF7EF-DE92-473E-8B6C-621EA663113A} 0 1 5 9 0x800 RPROXY {80000019-0001-FC00-B63F-84710C7967BB} ARR_RESPONSE_ENTITY_START请求路由{53AE50FA-81DF-47B1-8161-71F0A1C55A48} 0 1 5 10 0x800 RPROXY {80000019-0001-FC00-B63F-84710C7967BB} 253 ARR_RESPONSE_ENTITY_END RequestRouting {53AE50FA-81DF-47B1-8161-71F0A1C55A48} 0 1 5 52 0x0 RPROXY {80000019-0001-FC00-B63F-84710C7967BB} 1 GENERAL_NOT_SEND_CUSTOM_ERROR SETSTATUS_SUCCESS {D42CF7EF-DE92- 473E-8B6C-621EA663113A} 0 1 4 35 0x0 RPROXY {80000019-0001-FC00-B63F-84710C7967BB} GENERAL_FLUSH_RESPONSE_START {D42CF7EF-DE92-473E-8B6C-621EA663113A} 0 1 4 47 0x0 RPROXY {80000019-0001-FC00-B63F- 84710C7967BB} Cache-Control:no-cache Pragma:no-cache Content-Length:253 Content-Type:application / json; charset = utf-8过期时间:}} GENERAL_RESPONSE_ENTITY_BUFFER {D42CF7EF-DE92-473E-8B6C-621EA663113A} 0 1 4 36 0x0 RPROXY {80000019-0001-FC00-B63F-84710C7967BB} 580 0 GENERAL_FLUSH_RESPONSE_END操作成功完成。(0x0){D42CF7EF-DE92-473E-8B6C-621EA663113A} 0 1 0 2 0x0 RPROXY {80000019-0001-FC00-B63F-84710C7967BB} 580 1100 200 0 GENERAL_REQUEST_END {D42CF7EF-DE92-473E-8B6C-621EA663113A}

    马利克 -2017年7月10日星期一6:46:34 AM

  • 当我们将在URLrewrite中启用递归搜索?例如,我想规则,从孩子的web.config和根web.config执行只是引用指向孩子的web.config ..

URL重写2.1.mis的更多相关文章

  1. Nginx 反向代理、负载均衡、页面缓存、URL重写及读写分离详解

    转载:http://freeloda.blog.51cto.com/2033581/1288553 大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负 ...

  2. 用.htaccess文件实现URL重写

    注:第一部分来自 http://www.cnblogs.com/wangkongming/archive/2012/11/13/2768251.html     这位博主的个人网站简洁   还有诗歌  ...

  3. ASP.NET Core中使用URL重写

    ASP.NET Core 1.1 Preview 1 中新增了 URL Rewriting middleware ,终于可以进行 URL 重写了,实际使用体验一下. 首先要将 ASP.NET Core ...

  4. 微软的坑:Url重写竟然会引起IIS内核模式缓存不工作

    万万没有想到!当初为了解决使用负载均衡时记录客户端IP地址的问题,在IIS URL Rewrite Module中增加了一条URL重写规则(详见迁入阿里云后遇到的Request.UserHostAdd ...

  5. 【url重写】

    一.原理void Application_BeginRequest(object sender, EventArgs e)    {  //url重写        HttpApplication a ...

  6. asp.net mvc 中 一种简单的 URL 重写

    asp.net mvc 中 一种简单的 URL 重写 Intro 在项目中想增加一个公告的功能,但是又不想直接用默认带的那种路由,感觉好low逼,想弄成那种伪静态化的路由 (别问我为什么不直接静态化, ...

  7. UrlRewritingNet伪静态的使用方法与解决方案(URL重写)

    在建站初期时,我们往往需要考虑的是使用真静态还是伪静态,这对于往后的站点配置,延展性都会产生深远的影响. 我使用伪静态的唯一目的:SEO优化.毋容置疑,伪静态在对于Spider是非常有利的,因此,我更 ...

  8. nginx的URL重写应用实例

    1,NGINx的URL重写 NGINX 的URL重写模块用的比较多,主要使用的命令有if rewrite set break 2 if命令 语法如下"" 语法:if(conditi ...

  9. springMVC学习之url重写:urlrewrite with tuckey UrlRewriteFilter

    在开发网站时地址栏的一些信息是我们不希望让客户看到,所以在开发时候就会涉及到url重写的问题. 下面介绍一种常用的url地址重写的方法. 1.利用maven下载相关jar文件,pom文件配置如下: & ...

随机推荐

  1. 项目内部IT/电商/信息化类简报,分享电子版

    除了一些国内不准发的内容,还有公司内部项目相关的.其他的大多数资料会在微信公众号推送,分享一下吧,希望大家也能推荐一些好文章. 微信公众号:WallinWind,原创IT类文章在CSDN博客也会同步更 ...

  2. 如何调整word中表格某一列占半分比

    1.可以拖动,但是不准确 2.

  3. C#写的COM组件注册问题兼论微软Regasm注册的BUG

    工作中自己用C#写了专门读写EXCEL(不需要OFFICE环境,直接读原始文件,速度快)的COM组件,在使用过程中,发现原先的注册程序是有问题的.网上也有同样的网友碰到这个问题,但都没找到合适的解决办 ...

  4. DXT 图片压缩(DXTC/DirectX Texture Compression Overview)

    这两天在写 DDS 格式的解码程序.DDS 是微软为 DirectX 开发的一种图片格式,MSDN 上可以查到其文件格式说明: http://msdn2.microsoft.com/en-us/lib ...

  5. Java知识回顾 (2) Java 修饰符

    一.Java 修饰符 1.1 访问控制修饰符 Java中,可以使用访问控制符来保护对类.变量.方法和构造方法的访问.Java 支持 4 种不同的访问权限. default (即缺省,什么也不写): 在 ...

  6. 迭代dict的key和value

    我们了解了如何迭代 dict 的key和value,那么,在一个 for 循环中,能否同时迭代 key和value?答案是肯定的. 首先,我们看看 dict 对象的 items() 方法返回的值: & ...

  7. Android上的单元测试

    Android上的单元测试 http://www.sina.com.cn  2009年12月04日 16:07  IT168.com [IT168 技术文档]任何程序的开发都离不开单元测试来保证其健壮 ...

  8. ios开发经常使用RGB色值

    iOS中RGB经常使用的色值,同一时候可将对颜色的设置定义成宏,方便开发应用,如: // RGB颜色转换(16进制->10进制) #define UIColorFromRGB(rgbValue) ...

  9. 关于websocket集群中不同服务器的用户间通讯问题

    最近将应用部署到集群时遇到一个问题,即用户命中不同的服务器导致的用户间无法进行websocket通讯,在网上搜索到类似问题但都没有具体解决方案. 于是用redis的订阅发布功能解决了该问题,具体流程如 ...

  10. 详细解读Android中的搜索框(一)—— 简单小例子

    这次开的是一个讲解SearchView的栏目,第一篇主要是给一个小例子,让大家对这个搜索视图有一个了解,之后再分布细化来说. 目标: 我们先来定个目标,我们通过搜索框来输入要搜索的联系人名字,输入的时 ...