是否可以编写一个正则表达式来捕捉其他人在 IIS 中错过的匹配?

是否可以编写一个正则表达式来捕捉其他人在 IIS 中错过的匹配?

我已经编写了一个正则表达式列表,当前将未使用的页面重定向到适当使用的页面,例如,如果有人请求abc.aspx,它会将其重定向到IIS中的home.aspx,但是看到我无法解释所有页面,有没有办法捕获我可能错过的页面并将其映射到另一个页面?

答案1

使用 URL 重写模块 v2:

<rule name="CatchAll" stopProcessing="true">
    <match url=".*" />
    <conditions>
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
    </conditions>
    <action type="Rewrite" url="/catchall.aspx?page={REQUEST_URI}" />
</rule>

此规则将捕获对不存在的文件和目录的所有请求。通常,您会将其放在最后(最后左右)。

所有此类请求都将被重定向(当然是在内部)到/catchall.aspx文件,请求的 URL 将包含在page查询字符串参数中。例如,如果此页面 ( http://www.example.com/hello-kitten) 将通过此类 catch-all 文件路由,则它将被重写为/catchall.aspx?page=/hello-kitten


{REQUEST_FILENAME}:与请求匹配的文件或脚本的完整本地文件系统路径。例如:

  • 网站根目录:D:\websites\mysite.com\
  • 请求的 URL:http://mysite.com/help/delivery
  • {REQUEST_FILENAME}= D:\websites\mysite.com\help\delievry(即使这样的文件/文件夹不存在)——我相信您可以从上面的例子弄清楚它是如何构建的(如果涉及虚拟文件夹,那么它的工作方式会有所不同......但总体思路就在这里)。

如果将该规则的条件翻译成英文,则是:如果请求的资源不是文件也不是文件夹,则满足条件。

URL Rewrite 模块有IsFilematch 类型,但没有IsNotFile。要“模拟” ,IsNotFile需要IsFile与 配合使用negate="true"。 同理 也是如此IsDirectory

如果您通过 IIS 管理器访问 URL 重写模块,并单击此规则上的“编辑”,您将更容易理解它们到底起什么作用,而不是我的含糊其辞(IIS 管理器具有非常好的 GUI 来创建这些规则)。

答案2

哇,让我们为该配置提供更多背景信息!!

<configuration>
    <system.webServer>
        <staticContent>
            <mimeMap fileExtension=".json" mimeType="text/json" />
        </staticContent>
        <rewrite>
            <rules>
                <rule name="CatchAll" stopProcessing="true">
                    <match url=".*" />
                    <conditions>
                        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
                        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
                    </conditions>
                    <action type="Rewrite" url="/index.html" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>

相关内容