【问题标题】:Rewrite maps in IIS7 — how to make the match optionally include a trailing slash?在 IIS7 中重写映射 - 如何使匹配可选地包含尾部斜杠?
【发布时间】:2014-03-24 14:01:47
【问题描述】:

我已经阅读了 IIS rewrite map condition 等多个组合的前 30 个 Google 点击,但我在 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)但是,正如我在那里评论的那样,这似乎与该文本之前给出的具体示例有关,而不是而不是批发“这永远行不通”。

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

【问题讨论】:

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


    【解决方案1】:

    应该这样做:

    <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} 的反向引用

    我分享您在寻找合适的文档时遇到困难的经验;在以下文章的帮助下,我不得不尝试自己的方式:

    【讨论】:

    • 完美。谢谢! :)
    【解决方案2】:

    首先,不要使用点,它匹配一切,自然贪婪。改用字符否定:([^\n]+)。 试试这个,然后重新运行,如果不起作用,请尝试在 pattern 属性上再次添加 /?

    【讨论】:

    • 所有示例都使用点,fwiw。我的问题实际上是“我们可以使用哪些正则表达式?” — 如果我将pattern 设置为([^\n]+/?)([^\n]+/?) 并使用key="/buy/" 删除重写映射,则传入www.foo.com/buy 有效,但www.foo.com/buy/ 仍然是404s。抱歉,本没有雪茄 :)
    猜你喜欢
    • 2014-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-08
    • 1970-01-01
    • 1970-01-01
    • 2015-03-13
    • 1970-01-01
    相关资源
    最近更新 更多