1

我想阻止(或允许)来自 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。

我尝试过:

  1. 在我网站的同一个 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 中评论条件,则相同);

  1. 在 IIS 的主站点内创建了一个应用程序,其中包含“foo/rest/API/getName”规则(生成一个新的 web.config)并为某些 IP 添加了限制(来自插件 IIS),但仍然无法正常工作;

这个概念是不破坏原来的 FOO_RULE

有人知道吗?先感谢您!

4

2 回答 2

0

您可以尝试类似于以下规则来实现您的要求,在 Add Condition 对话框中,指定 {REMOTE_ADDR} 作为 Condition 输入。

<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>
于 2020-10-05T05:32:05.960 回答
0

您可以颠倒这两个规则,删除“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}”
于 2020-10-16T20:44:00.503 回答