2011-01-14 24 views
0

或者相反,我怎么才能重写一个URL,只有当它不存在?例如拦截404s。如何仅在重写的目标URL存在时使用ISAPI重写来重写URL?

下面是上下文:我们正在慢慢地将我们的网站从ASP classic迁移到ASP.NET。慢慢来说,我的意思是将9000页以上的.asp页面一次一页地转换为.aspx。

虽然这样做,我们要防止任何断开的链接,以及避免在搜索引擎中丢失任何排名。这意味着我们所有的.asp网址必须继续存在,即使它们将由.aspx页面提供。

我希望能够做的是有ISAPI重写规则将重写.asp - > .aspx,除非目标URL实际上不存在,在这种情况下,它只会执行并返回。 ASP。

因此,如果我们还没有将somepage.asp转换为.aspx,那么URL将不会被重写,并且会显示somepage.asp。一旦somepage.asp不存在,网址将被重写为somepage.aspx,然后网页浏览器/搜索引擎会认为它收到了somepage.asp。

在未来的某个时候,我们会在.aspx页面中设置canonical url,让搜索引擎在他们方便的时候赶上。

注意:我已经尝试过在IIS上使用自定义404来检查文件系统,并在目标.aspx页面存在的情况下执行Server.Transfer,但无法从asp classic转移到asp.net。 (你得到“指定的'页面语言=”c#“'选项是未知的或无效的错误'8000d001'”)这将工作的唯一方法是如果我们做了301/302重定向而不是Server.Transfer,那是在这个时候对我们不利。 (管理是偏执,并说没有选项。)

+0

为了检测404请求,需要进行Web请求,这是ISApi-Rewrite不会为你做的事情。我能想到的唯一方法是在转换它们时手动将ASP文件添加到ini文件中。 – 2011-01-14 19:22:51

+0

或者如果事情在文件夹中(希望它们是9000个以上的页面网站),那么你一次可以做到1个文件夹。 – 2011-01-14 19:23:35

回答

0

我想通了。正如Chris Haas所建议的那样,如果我让404处理程序成为一个.aspx页面,那么当目标页面存在时,我可以执行Server.Transfer,如果不存在,只需通过并返回常规404状态即可。所以像这样:

<%@ Page Language="c#" %> 

<%@ Import Namespace="System.IO" %> 
<script RunAt="server"> 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     String requestedUrl = Request.ServerVariables["HTTP_X_REWRITE_URL"]; 

     if (requestedUrl.EndsWith(".asp", StringComparison.CurrentCultureIgnoreCase)) { 
      String targetUrl = requestedUrl + "x"; 
      String targetPath = Server.MapPath(targetUrl); 

      if (File.Exists(targetPath)) { 
       Server.Transfer(targetUrl); 
      } 
     } 
     Response.Status = "404 Not Found"; 
    } 

</script> 

我仍然需要用querystrings测试它,但到目前为止,它完美地处理每个情况。当时机到来,管理层可以随时使用它时,我们将停止执行Server.Transfer并将其更改为301永久移动。由于IIS能够为每个目录设置错误页面,所以我们甚至可以稍微选择一下。

顺便说一下,它看起来像ISAPI_Rewrite 3可能有一个文件检查选项,也可以工作,但我们只有v2在我们的服务器上。

0

就个人而言,如果内容正在移动,你会想写一个进程,做一个301重定向来表明该页面已移到新的位置。事实确实如此。

这将确保新内容得到索引并适当链接。