如何使用 DB Provider 使 IIS 7/8 重写和重定向 URL

如何使用 DB Provider 使 IIS 7/8 重写和重定向 URL

如果这个问题很长,请耐心等待,但我从来没有使用过这个复杂的程序,它是在我入职之前由我的同事开发的。

我们的 Web 应用程序在 .NET Framework v2.0 CLR 上运行。无论如何,这个程序不是用 C# 编写的,但我们必须使用一个名为 Instant Developer 的框架来转换 .NET 应用程序中的代码。该应用程序在 IIS 8 下的 Windows Server 2012 R2 和 SQL Server 2014 R2 中运行。

因此,在这个应用程序中有一个非常大的目录,名为“photos”,其中包含用户完成的每项工作的照片。在开发该程序时,我们的客户告诉我们,只有很少的照片是强制性的,所以我的同事认为一个唯一的目录就足够了。但这些年来,要求发生了变化。因此,现在必须为每项工作拍摄一张照片,因此该目录今天包含超过 500 万个文件。因此,如果我尝试服务器块,它就无法再通过 Windows 资源管理器打开。上个月,我们的服务器遭到了加密锁的攻击,我的老板决定付费以获得解密器,否则我们的客户会要求我们为丢失的每个文件支付罚款。一旦我们完成恢复文件,我的老板就要求将这个巨大的目录划分为 /year/month/day 等子目录。这可以通过 python 脚本轻松完成,但问题是我们的客户在 SAP 中注册了一个链接来查看此表单的照片

https://www.ourserver.it/applicationName/photo/file.jpg

他们告诉我们他们拒绝更改它。因此,我想更改数据库中照片的路径,并以某种方式向 IIS 8 发出指令,以便当它收到类似上一个 URL 时,它应该查询数据库,发现新路径,然后将客户端重定向到新 URL,例如:

https://www.ourserver.it/applicationName/photo/year/month/day/file.jpg

我们使用的框架无法捕获此事件,这就是为什么我需要以这种方式编写 IIS 程序。

因此,我严格遵循指南和我安装URL 重写扩展代码示例

在 IIS 中,我向我的 Web 应用程序(在 IIS 内的站点中)添加了一个名为 DB 的重写 URL 提供程序,该提供程序应调用 SQL Server 数据库上的存储过程。存储过程运行良好:给定一个旧 URL,它会查询特定新数据库上的表(如指南所建议的)并返回新表。运行:

exec dbo.GetRewrittenUrl @input='http://localhost/OmniService/foto/18443151-810079.jpg'

我得到这个结果:http://localhost/OmniService/foto/2017/02/02/18443151-810079.jpg

以下是 web.config 文件中的内容:

<rewrite>
<rules>
    <rule name="DbProviderTest" stopProcessing="true">
        <match url="(http://localhost/OmniService/foto/([0-9]+)-([0-9]+).jpg)" />
        <conditions>
            <add input="{DB:{R:1}?{QUERY_STRING}}" pattern="(.+)" /> 
        </conditions>
        <action type="Redirect" url="{C:1}" />
    </rule>
</rules>
<providers>
    <provider name="DB" type="DbProvider, Microsoft.Web.Iis.Rewrite.Providers, Version=7.1.761.0, Culture=neutral, PublicKeyToken=0545b0627da60a5f">
        <settings>
            <add key="ConnectionString" value="Data Souce=localhost;Initial Catalog=Omniservice;Integrated Security=True" />
            <add key="StoredProcedure" value="GetRewrittenUrl" />
            <add key="CacheMinutesInterval" value="0" />
        </settings>
    </provider>
</providers>
</rewrite>

因此,根据该表,如果我执行

http://localhost/OmniService/foto/18443151-810079.jpg

我希望得到回报

http://localhost/OmniService/foto/2017/02/02/18443151-810079.jpg

但这种情况并没有发生,我得到了 404 HTTP 错误,并且没有新的 URL。或者有时我得到了 500 内部服务器错误。正则表达式是正确的,而且它被识别了,因为我用 IIS 测试过它。所以,我认为 IIS 和 DBMS 之间的通信存在某种问题。我尝试编写一些 python 脚本来测试给定的字符串连接是否正确,看起来是这样。但是编写字符串连接的可能性太多了。哪一个是正确的?我如何检测错误?我到底错过了什么?我已经为此工作了 10 多个小时,但我不知道在哪里寻找错误。你能帮忙吗?

答案1

作为

重写模块仅查看主机名后面的部分。

我尝试了这种配置,官方 IIS 论坛也向我建议了这种配置: 在此处输入图片描述

如您所见,模式正确,并且输入的 URL 作为测试被正确地拆分为捕获组。但它没有被捕获。我认为这是数据库的问题,所以我还尝试使用如下所示的 FileMapProvider:

<rewrite>
       <providers>
            <provider name="FileMap" type="FileMapProvider, Microsoft.Web.Iis.Rewrite.Providers, Version=7.1.761.0, Culture=neutral, PublicKeyToken=0545b0627da60a5f">
                <settings>
                    <add key="FilePath" value="{DOCUMENT_ROOT}\App_Data\redirectmappings.txt" />
                    <add key="IgnoreCase" value="1" />
                    <add key="Separator" value="," />
                </settings>
            </provider>
        </providers>
        <rules>
            <rule name="FileMapProviderTest" stopProcessing="true">
            <match url="(OmniService/foto/([0-9]+)-([0-9]+).jpg)" />
            <conditions>
                    <add input="{FileMap:{R:1}}" pattern="(.+)" />
            </conditions>
            <action type="Redirect" url="{C:1}" />
            </rule>
        </rules>
</rewrite>

其中C:\inetpub\wwwroot\OmniService\App_Data\redirectmappings.txt全是如下几行:

OmniService/foto/18443151-810079.jpg,OmniService/foto/2017/02/02/18443151-810079.jpg

什么都没有,甚至连重定向都尝试了一次。在浏览器的 URL 栏中,我总是看到相同的旧 URL。此外,如果我将确切的 URL 写为 test,例如:

<match url="http://localhost/OmniService/foto/18443151-810079.jpg" />

但这都没有被捕获。所以,我认为这些模块要么充满了错误,要么太旧,无法与较新版本的 IIS 正常工作。而且,由于在我发布的 5 个论坛 () 中没有人能够回答我的问题,所以我只能放弃了,因为我已经浪费了 5 个工作日来尝试让它工作……并让编写这些模块的人滚蛋。

相关内容