当您使用路径 (.*) 重写 url 时,如何从 IIS 拒绝特定 url 的 IP?
How to deny IP for a specific url from IIS when you have a rewrite url with path (.*)?
我想在 IIS 中针对特定 URL 阻止(或允许)某些来自站点的 ip。
实际上,我的 web.config 中有这条规则,用于重写 url:
<rule name="FOO_RULE" stopProcessing="true">
<match url="foo/(.*)" ignoreCase="false" />
<action type="Rewrite" url="http://pippo.it/{R:0}" logRewrittenUrl="true" />
</rule>
此规则适用于所有 IP 呼叫者,这没问题。
现在,我需要相同的规则来阻止特定路径的某些 IP。
问题是路径以“foo/”开头(例如“foo/rest/API/getName”)并且 IIS 仅适用于 FOO_RULE.
我尝试过:
- 在我的站点的同一个 web.config 中仅针对该路径 ("foo/rest/API/getName") EXCEPTION_FOO_PATH 创建了一条新规则,对某些 IP 进行了限制:
<rules>
<rule name="FOO_RULE" stopProcessing="true">
<match url="foo/(.*)" ignoreCase="false" />
<action type="Rewrite" url="http://pippo.it/{R:0}" logRewrittenUrl="true" />
<conditions>
<add input="{REQUEST_URI}" pattern="foo/rest/API/getName" negate="true" />
</conditions>
</rule>
<rule name="EXCEPTION_FOO_PATH">
<match url="foo/rest/API/getName" />
<conditions>
<add input="{REMOTE_ADDR}" pattern="111.222.333.444" negate="true" />
</conditions>
<action type="Rewrite" url="http://pippo.it/{R:0}" logRewrittenUrl="true" />
</rule>
</rules>
这不起作用(如果我在 FOO_RULE 中评论条件也是如此);
- 使用“foo/rest/API/getName”的规则(生成了一个新的 web.config)在 IIS 的主站点内创建了一个应用程序并添加了对某些 IP(来自插件 IIS)的限制,但仍然无法正常工作;
概念是不破坏原来的FOO_RULE
有人知道吗?
提前致谢!
您可以尝试类似以下规则来实现您的要求,在“添加条件”对话框中,指定 {REMOTE_ADDR} 作为条件输入。
<rule name="block IP" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{URL}" pattern=" " />
<add input="{REMOTE_ADDR}" pattern="xxx.xxx.xxx.xxx" />
</conditions>
<action type="CustomResponse" statusCode="401" statusReason="permission required" statusDescription="Access is denied due to invalid credentials." />
</rule>
你可以颠倒这两个规则,删除“FOO_RULE”中的条件并阻止“EXCEPTION_FOO_PATH”中的请求(看logicalgrouping="MatchAny"):
<rules>
<rule name="EXCEPTION_FOO_PATH" stopProcessing="true">
<match url="foo/rest/API/getName" />
<conditions logicalGrouping="MatchAny">
<add input="{REMOTE_ADDR}" pattern="111.222.333.444" />
<add input="{HTTP_X_Forwarded_For}" pattern="111.222.333.444" />
</conditions>
<action type="AbortRequest" />
</rule>
<rule name="FOO_RULE" stopProcessing="true">
<match url="foo/(.*)" ignoreCase="false" />
<action type="Rewrite" url="http://pippo.it/{R:0}" logRewrittenUrl="true" />
</rule>
</rules>
因此第一个规则首先适用:
- 如果 url 是“foo/rest/API/getName”并且 ip 是“111.222.333.444” -> 中止请求。
- 在所有其他情况下,第二条规则“FOO_RULE”适用并且 url 重写为“http://pippo.it/{R:0}”
我想在 IIS 中针对特定 URL 阻止(或允许)某些来自站点的 ip。 实际上,我的 web.config 中有这条规则,用于重写 url:
<rule name="FOO_RULE" stopProcessing="true">
<match url="foo/(.*)" ignoreCase="false" />
<action type="Rewrite" url="http://pippo.it/{R:0}" logRewrittenUrl="true" />
</rule>
此规则适用于所有 IP 呼叫者,这没问题。
现在,我需要相同的规则来阻止特定路径的某些 IP。 问题是路径以“foo/”开头(例如“foo/rest/API/getName”)并且 IIS 仅适用于 FOO_RULE.
我尝试过:
- 在我的站点的同一个 web.config 中仅针对该路径 ("foo/rest/API/getName") EXCEPTION_FOO_PATH 创建了一条新规则,对某些 IP 进行了限制:
<rules>
<rule name="FOO_RULE" stopProcessing="true">
<match url="foo/(.*)" ignoreCase="false" />
<action type="Rewrite" url="http://pippo.it/{R:0}" logRewrittenUrl="true" />
<conditions>
<add input="{REQUEST_URI}" pattern="foo/rest/API/getName" negate="true" />
</conditions>
</rule>
<rule name="EXCEPTION_FOO_PATH">
<match url="foo/rest/API/getName" />
<conditions>
<add input="{REMOTE_ADDR}" pattern="111.222.333.444" negate="true" />
</conditions>
<action type="Rewrite" url="http://pippo.it/{R:0}" logRewrittenUrl="true" />
</rule>
</rules>
这不起作用(如果我在 FOO_RULE 中评论条件也是如此);
- 使用“foo/rest/API/getName”的规则(生成了一个新的 web.config)在 IIS 的主站点内创建了一个应用程序并添加了对某些 IP(来自插件 IIS)的限制,但仍然无法正常工作;
概念是不破坏原来的FOO_RULE
有人知道吗? 提前致谢!
您可以尝试类似以下规则来实现您的要求,在“添加条件”对话框中,指定 {REMOTE_ADDR} 作为条件输入。
<rule name="block IP" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{URL}" pattern=" " />
<add input="{REMOTE_ADDR}" pattern="xxx.xxx.xxx.xxx" />
</conditions>
<action type="CustomResponse" statusCode="401" statusReason="permission required" statusDescription="Access is denied due to invalid credentials." />
</rule>
你可以颠倒这两个规则,删除“FOO_RULE”中的条件并阻止“EXCEPTION_FOO_PATH”中的请求(看logicalgrouping="MatchAny"):
<rules>
<rule name="EXCEPTION_FOO_PATH" stopProcessing="true">
<match url="foo/rest/API/getName" />
<conditions logicalGrouping="MatchAny">
<add input="{REMOTE_ADDR}" pattern="111.222.333.444" />
<add input="{HTTP_X_Forwarded_For}" pattern="111.222.333.444" />
</conditions>
<action type="AbortRequest" />
</rule>
<rule name="FOO_RULE" stopProcessing="true">
<match url="foo/(.*)" ignoreCase="false" />
<action type="Rewrite" url="http://pippo.it/{R:0}" logRewrittenUrl="true" />
</rule>
</rules>
因此第一个规则首先适用:
- 如果 url 是“foo/rest/API/getName”并且 ip 是“111.222.333.444” -> 中止请求。
- 在所有其他情况下,第二条规则“FOO_RULE”适用并且 url 重写为“http://pippo.it/{R:0}”