如何将 exclusion/negation 添加到 IIS 8 中的通用重写规则?
How to add exclusion/negation to a generic rewrite rule in IIS 8?
我在重写规则(在 IIS 8 上)中使用正则表达式来拒绝访问以点 (.) 开头的所有文件和文件夹
这样就无法访问这些Urls了:
- https://example.com/.forbidden_file
https://example.com/.forbidden_folder/somefile.txt
<rule name="Deny access to files and folders starting with . or /." patternSyntax="ECMAScript" enabled="true" stopProcessing="true">
<match url="(^\.|\/\.)" ignoreCase="true" negate="false" />
<action type="AbortRequest" />
</rule>
今天我想添加一个排除项,以允许访问名为“.specific_allowed_file”的特定文件和名为“.specific_allowed_folder”的特定文件夹,如下所示:
- https://example.com/.specific_allowed_file
- https://example.com/.specific_allowed_folder/somefile.txt
我通过添加两个条件设法实现了它,如下所示:
<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
子字符串,后跟 /
或字符串结尾 ( $
).
我在重写规则(在 IIS 8 上)中使用正则表达式来拒绝访问以点 (.) 开头的所有文件和文件夹 这样就无法访问这些Urls了:
- https://example.com/.forbidden_file
https://example.com/.forbidden_folder/somefile.txt
<rule name="Deny access to files and folders starting with . or /." patternSyntax="ECMAScript" enabled="true" stopProcessing="true"> <match url="(^\.|\/\.)" ignoreCase="true" negate="false" /> <action type="AbortRequest" /> </rule>
今天我想添加一个排除项,以允许访问名为“.specific_allowed_file”的特定文件和名为“.specific_allowed_folder”的特定文件夹,如下所示:
- https://example.com/.specific_allowed_file
- https://example.com/.specific_allowed_folder/somefile.txt
我通过添加两个条件设法实现了它,如下所示:
<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
子字符串,后跟/
或字符串结尾 ($
).