【问题标题】:How to check a file in a sub-folder for IIS Rewrite?如何检查子文件夹中的文件以进行 IIS 重写?
【发布时间】:2019-09-24 14:11:54
【问题描述】:

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>

重写永远不会在条件下发生。这意味着检查总是返回 false。我也尝试了以下条件无济于事:

<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。 config 无论我把它们放在哪里。

【问题讨论】:

  • 你可以尝试匹配如下: 此服务器变量匹配 URI.example 的绝对路径部分如果你输入 sample.com/s2 它将返回 /s2 。
  • @JanviPanchal 感谢您提供帮助。我完全按照你写的做了,但是没有用。我也尝试不使用第一个正斜杠:,它也失败了。测试网址是:“localhost/mywebapp/”实际上,我可以使用“localhost/mywebapp/_compressed_br/foo.dat”下载 foo.dat,所以你的建议应该有效。我在某处红色需要以某种方式将 URL 转换为文件路径。
  • 你能分享你的文件夹结构和测试网址吗?并尝试使用失败的请求跟踪来获取更多详细信息,为什么您的规则不起作用link
  • 您可以参考此链接,了解如何使用 url 重写来检查文件是否存在。 link1,link2,link3
  • @JalpaPanchal 我根据您的要求添加了信息。我启用了失败的请求跟踪,但在日志中没有看到任何内容。我怀疑它不被视为失败的请求。

标签: iis url-rewriting web-config


【解决方案1】:

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

可能还需要设置响应标头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>

【讨论】:

  • 再次感谢您的帮助。如果你不介意的话,我想知道你是否可以再次伸出你的手。由于很难在此处的评论中描述它,因此我将新挑战附加到原始问题中。你能看一下吗?如果您认为创建另一个问题更好,我很乐意这样做。
  • @Hong 通过this 我建议您提出一个新的后续问题,包括更多详细信息、网站根目录、Web 应用程序的根目录等。此外可能还有更好的解决方案,例如一个 HTTP模块文件而不是几个web.configs。
  • 谢谢。明天会做。在这里深夜。
  • 我在这里发布了新问题:stackoverflow.com/questions/58219097/…
猜你喜欢
  • 2013-11-08
  • 2014-04-08
  • 2013-05-02
  • 2023-04-07
  • 2018-09-18
  • 1970-01-01
  • 2018-07-31
  • 2013-10-16
  • 2012-08-23
相关资源
最近更新 更多