0

我正在重写一个使用多种不同非微软技术编写的旧网站。新站点是asp.net 网络表单。

我在数据库中有一个 OLD url 的列表,并且有一个例程将根据数据库中的 url 列表检查请求的页面 url,并执行适当的 301 重定向到内容 NEW url。

但是,从效率的角度来看,我的问题是,只有在请求的 Url 本质上是 404/未找到时,我才能执行此 OLD url 查找。我不想在每个页面请求(通过 global.asax 中的 Application_BeginRequest)时触发我的“Check-Old-Urls-And-Redirect-If-Found”例程,因为大多数情况下,请求的页面将是不需要 301 重定向的有效新 .net 页面。因此,我希望只有在它基本上要抛出 404 错误时才能触发我的例程。

我检查数据库中旧站点 URL 的例程已缓存,因此至少它不会每次都访问数据库,但我只想阻止它甚至调用此例程(并且偶尔会在缓存过期时访问数据库)没有必要的时候。

我在想也许我可以从 global.asax 中的 Application_Error 例程中执行旧的 url 查找,检查 404 状态的错误代码,在这种情况下,执行旧的 url 查找,但是在测试时,它似乎没有在 global.asax 的 Application_Error 例程中击中我的断点 - 相反,浏览器显示 IIS 7 404 Not Found 错误。

浏览器必须接收到对新 url 的 301 响应并且不会得到不正确的 404 响应代码(除非请求的 url 既不是新的也不是旧的风味 url)。

谁能推荐一种有效的方法来处理这种情况?

4

1 回答 1

0

IMO 最好的办法是安装IIS 重写模块并为所有旧 URL-s 创建重定向。您可以在单独的 XML 文件中进行 301 重定向,这是一种更简洁的方法,这是关于此的 SO 帖子:

IIS7 urlrewrite 模块 - 外部 xml 文件中的规则

更新:您可以简单地放置一个 url 列表,如下所示:

    <rule name="Redirect map bluesunhotels">
      <match url=".*"/>
      <conditions>
        <add input="{bluesunhotels:{REQUEST_URI}}" pattern="(.+)"/>
      </conditions>
      <action type="Redirect" url="{C:1}" appendQueryString="false"/>
    </rule>
  </rules>
  <rewriteMaps>
    <rewriteMap name="bluesunhotels">
      <add key="/index.php?show=2326" value="/resort-afrodita.aspx"/>
      <add key="/index.php?show=2271" value="/starigrad-paklenica.aspx"/>
    </rewriteMap>
  </rewriteMaps>
于 2012-05-14T10:40:02.487 回答