繁体   English   中英

仅当存在重写的目标URL时,如何使用ISAPI-Rewrite重写URL?

[英]How can I use ISAPI-Rewrite to rewrite a URL only when rewritten target URL exists?

或相反,如何仅在URL不存在的情况下重写URL? 例如,拦截404。

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

在此过程中,我们希望防止任何断开的链接,并避免在搜索引擎中失去任何排名。 这意味着我们所有的.asp URL都必须继续存在,即使它们由.aspx页面提供。

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

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

将来的某个时候,我们将在.aspx页中设置规范的url ,并让搜索引擎赶上它们的便利性。

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

就个人而言,如果内容正在移动,则需要编写一个过程,该过程执行301重定向以指示该页面已移动到新位置。 事实确实如此。

这将确保新内容被正确索引和链接。

我想到了。 正如克里斯·哈斯(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 Move Permanently。 IIS能够为每个目录设置错误页面,我们甚至可以在何时进行选择。

顺便说一句,看起来ISAPI_Rewrite 3可能具有文件检查选项,该选项也可能起作用,但服务器上只有v2。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM