如何检查 IIS 重写的子文件夹中的文件?

How to check a file in a sub-folder for IIS Rewrite?

web.config 中的以下重写 工作正常

<rule name="foo" stopProcessing="true">
  <match url="foo.dat$"/>
  <conditions>
    <!-- Match brotli requests -->
    <add input="{HTTP_ACCEPT_ENCODING}" pattern="br" />
  </conditions>
  <action type="Rewrite" url="_compressed_br/foo.dat" />
</rule>

我想添加一个条件,确保仅在子文件夹中的压缩文件存在时才完成重写:

<rule name="foo" stopProcessing="true">
  <match url="foo.dat$"/>
  <conditions>
    <!-- Match brotli requests -->
    <add input="{HTTP_ACCEPT_ENCODING}" pattern="br" />
    <!-- Check if the pre-compressed file exists on the disk -->
    <add input="{DOCUMENT_ROOT}/_compressed_br/foo.dat" matchType="IsFile" negate="false" />
  </conditions>
  <action type="Rewrite" url="_compressed_br/foo.dat" />
</rule>

条件不会发生重写。这意味着检查总是 returns 错误。我也尝试了以下条件无济于事:

<add input="{DOCUMENT_ROOT}_compressed_br/foo.dat" matchType="IsFile" negate="false" />
<add input="/_compressed_br/foo.dat" matchType="IsFile" negate="false" />
<add input="_compressed_br/foo.dat" matchType="IsFile" negate="false" />

有人可以提供这方面的建议吗?

编辑(2019-09-27): 文件夹结构:

Web 应用 foo 的目录是 ...\dist。 打开 Web 应用程序的 URL 是: http://localhost/foo/

编辑(2019-09-30):

编辑 (2019-10-01):

接受的答案对上述问题很有帮助。

我有一个新的挑战。 如果我将 web 文件放在以下目录中: C:\mywebsite\home\dist\web.config

网站绑定了8086端口,我可以浏览如下网页: https://localhost:8086/home/dist/

要进行重写,我必须使用以下内容:

 <add input="{APPL_PHYSICAL_PATH}home\dist\_compressed_br\foo.dat" matchType="IsFile" negate="false" />

由于我可能会把dist文件夹下的内容放在任意目录下对应web.config的地方,想知道有没有参数可以代替"{APPL_PHYSICAL_PATH}home\dist " 这样无论我把它们放在哪里,我都可以使用相同的 web.config。

您可以使用 {APPL_PHYSICAL_PATH} 找到您的 Web 应用 foo 的根文件夹。

可能还需要设置响应 header Content-Encoding: br 以防止意外行为,例如 foo.dat 的文件下载对话框而不是显示其解码响应。

这是您需要的规则:

<rule name="foo" stopProcessing="true">
    <match url="^foo\.dat$" />
    <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
        <add input="{HTTP_ACCEPT_ENCODING}" pattern="br" />
        <!-- {APPL_PHYSICAL_PATH} equals to {DOCUMENT_ROOT} + "dist\" in your setup -->
        <add input="{APPL_PHYSICAL_PATH}_compressed_br\foo.dat" matchType="IsFile" />
    </conditions>
    <action type="Rewrite" url="_compressed_br/foo.dat" />
    <serverVariables>
        <set name="RESPONSE_Content-Encoding" value="br" />
    </serverVariables>
</rule>