或者相反,如果URL不存在,我怎么能重写?例如,拦截404s。
以下是上下文:我们正在慢慢地将我们的站点从ASP classic迁移到ASP.NET。慢慢地,我的意思是一次将9000 + .asp页面一页转换为.aspx。
在执行此操作时,我们希望防止任何损坏的链接以及避免丢失搜索引擎中的任何排名。这意味着我们所有的.asp网址都必须继续存在,即使它们是由.aspx页面提供的。
我希望能够做的是ISAPI-Rewrite规则将重写.asp - > .aspx除非目标URL实际上不存在,否则它只会执行并返回.asp。
因此,如果我们尚未将somepage.asp转换为.aspx,则不会重写URL并显示somepage.asp。一旦somepage.asp消失,URL将被重写为somepage.aspx,这将被执行并返回,但Web浏览器/搜索引擎会认为它收到了somepage.asp。
在未来的某个时刻,我们会在.aspx页面中设置canonical url,让搜索引擎在方便的时候赶上。
注意:我已尝试在IIS上使用自定义404来检查文件系统并执行Server.Transfer,如果目标.aspx页面存在,但是您无法从asp经典转移到asp.net。 (你得到“指定的'Page Language =”c#“'选项未知或无效。错误'8000d001'”)唯一可行的方法是,如果我们进行301/302重定向而不是Server.Transfer,那就是这个时候我们不受欢迎。 (管理层偏执,并说不是一种选择。)
答案 0 :(得分:0)
就个人而言,如果内容正在移动,您可能希望编写一个执行301重定向的流程,以指示该页面已移至新位置。事实确实如此。
这将确保新内容得到适当的索引和链接。
答案 1 :(得分: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>
我仍然需要使用查询字符串进行测试,但到目前为止它完全处理每个案例。当时机到来并且管理层没问题时,我们将停止执行Server.Transfer并将其更改为301 Moved Permanently。由于IIS能够为每个目录设置错误页面,我们甚至可以对我们何时进行选择。
顺便说一句,看起来ISAPI_Rewrite 3可能有一个文件检查选项也可以工作,但我们的服务器上只有v2。