【发布时间】: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-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。
-
@JalpaPanchal 我根据您的要求添加了信息。我启用了失败的请求跟踪,但在日志中没有看到任何内容。我怀疑它不被视为失败的请求。
标签: iis url-rewriting web-config