如果Url无效,请在抛出404错误之前执行旧版URL查找

时间:2012-05-14 09:26:24

标签: asp.net

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

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

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

我检查旧网站Url的Db的例程是缓存的,所以至少它不会每次都访问数据库,但我只是想阻止它甚至调用这个例程(偶尔会在缓存时命中数据库)已经过期了,但没有必要。

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

浏览器必须收到对新网址的301响应,并且不会收到错误的404响应代码(除非请求的网址既不是新的或旧的风格网址)。

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

1 个答案:

答案 0 :(得分:0)

IMO要做的最好的事情是安装IIS Rewrite Module并为所有旧网址创建重定向。你可以在单独的XML文件中拥有301重定向,这是一个更清晰的方法,这是关于此的SO帖子:

IIS7 urlrewrite module - Rules in external xml file

更新:您只需输入一个网址列表,如下所示:

    <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>