针对单个请求应用来自多个 web.config 的 IIS 重写规则

针对单个请求应用来自多个 web.config 的 IIS 重写规则

我正在尝试在 IIS 网站中配置目录结构,并在各个级别应用重写规则。例如,考虑以下结构:

Default Web Site
├─ web.config
└─ v1
   ├─ web.config
   └─ wwwroot
      └─ hello.txt

我希望能够hello.txt通过 http://localhost/hello.txt 进行访问。我在网站根级别进行了web.config如下配置:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <rewrite>
      <rules>
        <rule name="Rewrite to v1" stopProcessing="false">
          <match url="^(?!v1).*" />
          <action type="Rewrite" url="v1\{R:0}" />
        </rule>
      </rules>
    </rewrite>
  </system.webServer>
</configuration>

我在目录web.config中进行了v1如下配置:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <rewrite>
      <rules>
        <rule name="Rewrite to wwwroot" stopProcessing="false">
          <match url="^(?!wwwroot).*" />
          <action type="Rewrite" url="wwwroot\{R:0}" />
        </rule>
      </rules>
    </rewrite>
  </system.webServer>
</configuration>

当我访问 http://localhost/v1/hello.txt 时,一级重写可以正常工作,但二级重写对 http://localhost/hello.txt 不起作用。IIS 错误页面显示请求仍在解析为物理路径,…\v1\hello.txt而不是…\v1\wwwroot\hello.txt;请参阅https://i.stack.imgur.com/KjdH5.png。请注意,将重写更改为重定向可成功提供文件。

有没有办法让它工作,或者这是 URL 重写模块的一些限制?微软似乎声称这在URL 重写模块配置参考

规则继承

如果在多个配置级别上定义了规则,则 URL 重写模块将按以下顺序评估规则:

  1. 评估所有全局规则。
  2. 评估包含来自父配置级别的分布式规则以及来自当前配置级别的规则的规则集。评估按从父到子顺序执行,这意味着首先评估父规则,最后评估在最后一个子级别上定义的规则。

我知道我可以让web.config网站根级别的wwwroot直接引用内部目录(通过url="v1\wwwroot\{R:0}")。但是,我不想这样做。我最终将扩展外部web.config以支持其他版本(v2v3、...),这些版本可能有也可能没有wwwroot子目录,因此在特定于版本的 中维护对内部子目录的任何特定于版本的重写会更简洁web.config

我尝试使用失败请求跟踪。记录显示外部规则Rewrite to v1已成功运行。没有提及内部规则Rewrite to wwwroot

相关内容