如何在IIS 8中将排除/否定添加到通用重写规则?

时间:2018-08-21 06:13:15

标签: regex iis iis-8 regex-negation

我在重写规则(在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>

您知道这是否是可靠的实现,还是我应该使用其他方法,例如修改匹配的正则表达式?

非常感谢您,

1 个答案:

答案 0 :(得分:1)

您的方法非常好,因为它允许用户使用可读和清晰的代码添加条件。应该注意一件事: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子字符串,其后跟/或字符串结尾({{ 1}})。