0

或者相反,如果 URL 不存在,我如何才能重写它?例如,拦截 404s。

上下文如下:我们正在慢慢地将我们的站点从 ASP 经典迁移到 ASP.NET。慢慢地,我的意思是将 9000 多个 .asp 页面一次一页转换为 .aspx。

在这样做的同时,我们希望防止任何断开的链接,并避免丢失搜索引擎中的任何排名。这意味着我们所有的 .asp URL 必须继续存在,即使它们将由 .aspx 页面提供服务。

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

因此,如果我们还没有将 somepage.asp 转换为 .aspx,则 URL 不会被重写,并且会显示 somepage.asp。一旦 somepage.asp 消失,URL 将被重写为 somepage.aspx,它会被执行并返回,但 Web 浏览器/搜索引擎会认为它收到了 somepage.asp。

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

注意:我已经尝试在 IIS 上使用自定义 404 来检查文件系统并在目标 .aspx 页面存在时执行 Server.Transfer,但是您无法从 asp classic 传输到 asp.net。(您会得到“指定的 'Page Language="c#" ' 选项未知或无效。错误 '8000d001'" )唯一可行的方法是我们执行 301/302 重定向而不是 Server.Transfer,那就是在这个时候对我们来说是不可取的。(管理层是偏执狂,说不是一种选择。)

4

2 回答 2

0

就个人而言,如果内容正在移动,您可能希望编写一个执行 301 重定向的进程,以指示页面已移动到新位置。事实确实如此。

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

于 2011-01-14T18:55:58.853 回答
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。

于 2011-01-17T15:14:38.980 回答