在 IIS 上为具有相同命名的文件夹和文件配置正确的路由

Configure correct routing for folder and file with the same naming on IIS

我有带隐藏扩展的网站托管 IIS 使用此规则

            <rule name="Hide .html ext">
                <match ignoreCase="true" url="^(.*)"/>
                <conditions>
                    <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true"/>
                    <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true"/>
                    <add input="{REQUEST_FILENAME}.html" matchType="IsFile"/>
                </conditions>
                <action type="Rewrite" url="{R:0}.html"/>
            </rule>
            <rule name="Redirecting .html ext" stopProcessing="true">
                <match url="^(.*).html"/>
                <conditions logicalGrouping="MatchAny">
                    <add input="{URL}" pattern="(.*).html"/>
                </conditions>
                <action type="Redirect" url="{R:1}"/>
            </rule>

主要问题是我有一个没有扩展名的文件与我的一个文件夹具有相同的命名 例如 wwwroot/page.html wwwroot/page/page.html

当此规则应用服务器时return 403 - 当我调用 www.test.com/page 时被禁止 当我调用 www.test.com/page/page 时一切正常 是否可以配置 url 重写模块以更正此路径的工作?

您可以针对该问题采取一些解决方法。如果你要删除这个条件:<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true"/>

那么您的 HTML 页面将适用于此 url www.test.com/pagewww.test.com/page/page 但不适用于 www.test.com/page/(它将 return禁止)。

如果 page.html 是您系统中的一个例外,您不会有相同的冲突,那么您也可以用另一种方式,为您的 url 创建附加规则。只需在 Hide .html ext 规则之前添加此规则:

<rule name="Exception for page" stopProcessing="true">
     <match url="^(page)(\/?)$" />
     <action type="Rewrite" url="{R:1}.html" />
</rule>  

在这种情况下,所有 URL 都将正常工作:

  • www.test.com/page
  • www.test.com/page/
  • www.test.com/page/page