regex - 在 IIS7 中重写映射 - 如何使匹配可选地包含尾部斜杠?

标签 regex iis-7 url-rewrite-module rewritemap

我已经阅读了 IIS rewrite map condition 的几种组合的前 30 个谷歌点击量等等,但我在 microsoft.com 站点或其他地方找不到任何像样的文档。

我在 IIS7 中有一堆重写映射,我想处理它们,无论它们后面是否跟有斜杠。所以www.foo.com/barwww.foo.com/bar/应该都匹配规则。

<rewrite>
    <rewriteMaps>
        <rewriteMap name="ShortURLs">
            <add key="/terms" value="/en-us/terms-and-conditions/"/>
            <add key="/privacy" value="/en-us/privacy-and-cookies/"/>
            <add key="/buy" value="/en-us/where-to-buy/"/>
        </rewriteMap>
    </rewriteMaps>
    <rules>
        <rule name="Short URL redirects">
            <match url="^/?(.+)/?$" />
            <conditions>
                <add input="{ShortURLs:{REQUEST_URI}}" pattern="(.+)"/>
            </conditions>
            <action type="Redirect" url="{C:1}" appendQueryString="true"/>
        </rule>
    </rules>
</rewrite>

现在这工作得很好,除了我能找到的唯一方法 /terms/匹配重写映射中的第一个键是复制映射,使其读取:

<rewriteMap name="ShortURLs">
    <add key="/terms" value="/en-us/terms-and-conditions/"/>
    <add key="/privacy" value="/en-us/privacy-and-cookies/"/>
    <add key="/buy" value="/en-us/where-to-buy/"/>

    <add key="/terms/" value="/en-us/terms-and-conditions/"/>
    <add key="/privacy/" value="/en-us/privacy-and-cookies/"/>
    <add key="/buy/" value="/en-us/where-to-buy/"/>
</rewriteMap>

鉴于我首先使用正则表达式来匹配它们,这看起来非常不雅致。添加 /?到条件输入或条件模式似乎不起作用。

我见过the answerIIS7 Rewrite Map Regex?提到不能使用正则表达式(引用自 Using Rewrite Maps in URL Rewrite Module )但是,正如我在那里评论的那样,这似乎与该文本之前给出的具体示例有关,而不是批发“这永远行不通”。

我错过了什么?必须有一些方法可以做到这一点;我错过了一些明显的东西吗?

最佳答案

这应该这样做:

<rewrite>
    <rewriteMaps>
        <rewriteMap name="ShortURLs">
            <add key="terms" value="/en-us/terms-and-conditions/"/>
            <add key="privacy" value="/en-us/privacy-and-cookies/"/>
            <add key="buy" value="/en-us/where-to-buy/"/>
        </rewriteMap>
    </rewriteMaps>
    <rules>
        <rule name="Short URL redirects">
            <match url="^(.+?)/?$" />
            <conditions>
                <add input="{ShortURLs:{R:1}}" pattern="(.+)" />
            </conditions>
            <action type="Redirect" url="{C:1}" appendQueryString="true"/>
        </rule>
    </rules>
</rewrite>

你很亲近;我只需要做三个小改动:
  • 删除了重写映射中键中的前导斜杠
  • 使用了非贪婪量词 +?在规则匹配中
  • 使用了对匹配项的反向引用 {R:1}在条件输入

  • 我分享了您在难以找到像样的文档方面的经验;在以下文章的帮助下,我不得不尝试自己的方法:
  • http://www.iis.net/learn/extensions/url-rewrite-module/using-rewrite-maps-in-url-rewrite-module
  • http://technet.microsoft.com/en-us/library/ee215190(v=ws.10).aspx
  • 关于regex - 在 IIS7 中重写映射 - 如何使匹配可选地包含尾部斜杠?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22611622/

    相关文章:

    iis - 如何使用 IIS7 URL 重写模块重定向到应用程序根目录?

    apache - 将 .htaccess 导入 IIS URL 重写 Web.Config 时出现问题

    JavaScript:使用正则表达式提取两个可选字符之间的字符串部分

    asp.net - Application_AcquireRequestState 中的 Context.Session 对象为 null

    php - RegExr 至少有 2 个字母和可选字母,但没有其他字母?

    asp.net - TeamCity 构建任务以自动启动 ASP.NET 网站

    visual-studio-2010 - 开始调试和附加到进程有什么区别

    asp.net-mvc - IIS Express Url 重写模块非常简单的重定向不起作用

    java - 使用正则表达式阻止 jtextfield 中的 SQL 注入(inject)条目

    regex -\S、\W、\D 在正则表达式中代表什么?