我正在尝试使用自定义路由(派生自 RouteBase 的类)编写 301 重定向方案,类似于为MVC 中的任何级别处理旧版 url。我正在使用反射器查看 RedirectPermanent() 方法中的 HttpResponse 类,并注意到代码既设置了状态又输出了一个简单的 HTML 页面。
this.StatusCode = permanent ? 0x12d : 0x12e;
this.RedirectLocation = url;
if (UriUtil.IsSafeScheme(url))
{
url = HttpUtility.HtmlAttributeEncode(url);
}
else
{
url = HttpUtility.HtmlAttributeEncode(HttpUtility.UrlEncode(url));
}
this.Write("<html><head><title>Object moved</title></head><body>\r\n");
this.Write("<h2>Object moved to <a href=\"" + url + "\">here</a>.</h2>\r\n");
this.Write("</body></html>\r\n");
这是可取的,因为根据我的经验,并非所有浏览器都配置为遵循 301 重定向(尽管搜索引擎会这样做)。因此,如果浏览器没有自动转到该页面,也应该给用户一个指向该页面的链接。
我想做的是把它提升到一个新的水平——我想输出 MVC 视图的结果(连同它的主题布局页面),而不是在响应中硬编码丑陋的通用 HTML。就像是:
private void RedirectPermanent(string destinationUrl, HttpContextBase httpContext)
{
var response = httpContext.Response;
response.Clear();
response.StatusCode = 301;
response.RedirectLocation = destinationUrl;
// Output a Custom View Here
response.Write(The View)
response.End();
}
如何将视图的输出写入响应流?
附加信息
过去,我们遇到过从 mydomain.com 到 www.mydomain.com 的 301 重定向问题,随后收到大量用户报告 SSL 证书无效。搜索引擎完成了他们的工作,但在我切换到 302 重定向之前,用户遇到了问题。我实际上无法重现它,但我们收到了大量报告,所以必须做点什么。
我计划让视图执行元重定向和 javascript 重定向,以帮助提高可靠性,但对于那些仍停留在 301 页面的用户,我希望他们有宾至如归的感觉。我们已经有自定义的 404 和 500 页面,为什么不也有自定义主题的 301 页面呢?