IIS - URL 重写在 URL 中包含单词 'data' 时不起作用

IIS - URL Rewrite not working when the URL has the word 'data' in it

我不确定这个标题是否有意义,但为了进一步解释,我有一个网站,每个请求都需要访问我名为 controller.php 的文件。

我已经使用了一段时间,今天包含 pdf 文件的新目录被添加到站点。目前该目录中有两个文件可通过超链接访问。

我访问的两个相对路径是:http://q360help.joehelp.com/Docs/Document_Grid_Filters.pdf
正确重定向到:
http://q360help.joehelp.com/controller.php?Docs/Document_Grid_Filters.pdf

AND

http://q360help.joehelp.com/Docs/SERVERDATA.pdf
应该但目前没有重定向到:
http://q360help.joehelp.com/controller.php?Docs/SERVERDATA.pdf

相反,我收到 404 错误,这是在尝试访问未通过控制器的任何内容时预期的错误。当我手动将 controller.php 添加到 URL 时,文件加载正常。我只是好奇为什么它没有正确重定向。每个其他目录中的每个其他 pdf 文件都可以正常工作。

这是我的 web.config 文件:

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
        <system.webServer>
            <httpRedirect enabled="false" destination="" />
            <rewrite>
                <rules>
                    <rule name="controller redirect" enabled="true" stopProcessing="true">
                <match url=".*" />
                <conditions>
                    <add input="{HTTP_HOST}" pattern="^(http://)?(www.)?joehelp.com" negate="true" />
                    <add input="{HTTP_HOST}" matchType="Pattern" pattern="^(http://)?(www.)?q360help.joehelp.com$" ignoreCase="true" negate="false" />
                    <add input="{URL}" pattern="Data/*" negate="true" />
                    <add input="{URL}" pattern="Skins/*" negate="true" />
                    <add input="{URL}" pattern="Resources/*" negate="true" />
                    <add input="{PATH_INFO}" pattern="^/controller.php*$" negate="true" />
                </conditions>
                <action type="Redirect" url="/controller.php?{R:0}" />
            </rule>
        </rules>
    </rewrite>
    <httpErrors errorMode="Detailed" />
</system.webServer>

编辑: 经过进一步测试,似乎 URL 中的任何地方都有单词 'data' 是导致它中断的原因。这是一件事吗?我从来没有听说过这样的事情,通过 IIS 中的 GUI 使用 URL 重定向模式测试器表明 URL 应该 重定向。

此时我的解决方法是更改​​文件名,使其中没有 'data',但我很想知道 为什么 会发生这种情况。

你这行的问题:

<add input="{URL}" pattern="Data/*" negate="true" />

因为您使用的是未转义的正斜杠 /,此字符串将匹配您的正则表达式:

  • /Data/something
  • /Docs/SERVERDATA.pdf
  • /数据
  • /数据数据

你的解决办法很简单,你只需要转义这个斜杠。最终的正则表达式应该是:Data//*