如何将 exclusion/negation 添加到 IIS 8 中的通用重写规则?

How to add exclusion/negation to a generic rewrite rule in IIS 8?

我在重写规则(在 IIS 8 上)中使用正则表达式来拒绝访问以点 (.) 开头的所有文件和文件夹 这样就无法访问这些Urls了:

今天我想添加一个排除项,以允许访问名为“.specific_allowed_file”的特定文件和名为“.specific_allowed_folder”的特定文件夹,如下所示:

我通过添加两个条件设法实现了它,如下所示:

    <rule name="Deny access to files and folders starting with . or /." patternSyntax="ECMAScript" enabled="true" stopProcessing="true">
        <match url="(^\.|\/\.)" ignoreCase="true" negate="false" />
        <conditions logicalGrouping="MatchAny">
            <add input="{PATH_INFO}" pattern="(.*)(\.specific_allowed_file$" negate="true" />
            <add input="{PATH_INFO}" pattern="(.*)(\.specific_allowed_folder)(.*)" negate="true" />
        </conditions>
        <action type="AbortRequest" />
    </rule>

你知道这是否是一个可靠的实现,或者我是否应该使用另一种方法,比如修改我的匹配正则表达式?

非常感谢,

您的方法非常好,因为它允许用户使用可读且清晰的代码添加条件。应该注意一件事:pattern="(.*)(\.specific_allowed_folder)(.*)" 也将允许 .specific_allowed_folder_WITH_MORE_TEXT_HERE。您可以通过将 / 添加到第一组和第三组并通过在组之后放置 ? 量词使其成为可选来修复它以仅匹配文件夹:

<add input="{PATH_INFO}" pattern="^(.*/)?(\.specific_allowed_folder)(/.*)?$" negate="true" />

如果您希望单个正则表达式完成整个工作,请使用负前瞻的正则表达式:

<match url="(^|/)\.(?!(specific_allowed_file|specific_allowed_folder)(/|$))" ignoreCase="true" negate="false" />

参见regex demo

详情

  • (^|/) - 字符串开头或 /
  • \. - 一个点
  • (?!(specific_allowed_file|specific_allowed_folder)(/|$)) - 不紧跟 specific_allowed_file 或 (|) specific_allowed_folder 子字符串,后跟 / 或字符串结尾 ( $).