MVCの任意のレベルのレガシーURLの処理と同様のカスタムルート(RouteBaseから派生したクラス)を使用して301リダイレクトスキームを作成しようとしています。リフレクターを使用して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リダイレクトに従うように構成されているわけではないため、これは望ましいことです(検索エンジンはそうしますが)。したがって、ブラウザが自動的にそこに移動しない場合に備えて、ユーザーにページへのリンクを提供することも理にかなっています。
私がやりたいのは、これを次のレベルに引き上げることです。応答にハードコーディングされた醜い汎用HTMLを使用する代わりに、MVCビューの結果を(テーマのあるレイアウトページとともに)出力したいと思います。何かのようなもの:
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ページもありませんか?