如何检查 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>
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>