能否通过Conditions将两条IIS URL Rewrite规则合并为一条?
IIS URL Rewrite规则合并与名称问题解答
规则名称的强制要求
首先明确:IIS URL Rewrite模块不允许存在同名规则,你当前的两条规则都命名为"Venue"是无效的,必须修改为不同的唯一名称,比如分别命名为Venue_Details和Venue_WithConcert。
能否合并为一条规则?
可以合并为一条规则,不需要依赖<conditions>也能实现,不过通过条件可以更优雅地处理可选参数。以下是合并后的完整规则:
<rule name="Venue_Combined" stopProcessing="true"> <match url="Venue/([_0-9a-z-]+)/([_0-9a-z-]+)(?:/([_0-9a-z-]+))?" /> <action type="Rewrite" url="Main.asp?Type=Venue&VenueID={R:1}&VName={R:2}{C:0}" appendQueryString="true" /> <conditions> <add input="{R:3}" pattern=".+" /> <add input="&ConcertID={R:3}" pattern="(.+)" /> </conditions> </rule>
规则说明:
- 匹配URL:
(?:/([_0-9a-z-]+))?表示第三个捕获组是可选的(?:为非捕获分组,?表示允许出现0次或1次),可同时匹配/Venue/37/The_Omni和/Venue/37/The_Omni/1两类URL;另外原正则里的(-)-,-属于冗余写法,简化为[_0-9a-z-]+即可覆盖需求。 - 条件处理:通过
<conditions>判断{R:3}是否有值,若存在则将&ConcertID={R:3}作为{C:0}变量插入重写URL;若{R:3}为空,条件不匹配则{C:0}为空字符串,不会生成多余的空参数。
备选方案:保留两条规则(修改名称)
如果不想合并,也可以保留两条独立规则,只需修改为不同名称即可,逻辑更清晰,维护更直观:
<rule name="Venue_Details" stopProcessing="true"> <match url="Venue/([_0-9a-z-]+)/([_0-9a-z-]+)" /> <action type="Rewrite" url="Main.asp?Type=Venue&VenueID={R:1}&VName={R:2}" appendQueryString="true" /> </rule> <rule name="Venue_WithConcert" stopProcessing="true"> <match url="Venue/([_0-9a-z-]+)/([_0-9a-z-]+)/([_0-9a-z-]+)" /> <action type="Rewrite" url="Main.asp?Type=Venue&VenueID={R:1}&VName={R:2}&ConcertID={R:3}" appendQueryString="true" /> </rule>
内容的提问来源于stack exchange,提问作者CodingEE
相关产品推荐
相关产品推荐

