要求されたページを表示する404ページ
-
02-07-2019 - |
質問
最近、Webサイトを新しいCMS(Umbraco)に移行しました。多くのリンクが変更されましたが、URLでパターンを検索することで簡単に修正できるため、古いページが見つからない場合に正しいページにリダイレクトするものを書きたいと思います。その部分は問題ではありません。
ブラウザがカスタム404ページにリダイレクトされた後、要求されたURLを取得するにはどうすればよいですか。私は使ってみました:
request.ServerVariables("HTTP_REFERER") 'sorry i corrected the typo from system to server.
しかし、それはうまくいきませんでした。
アイデアはありますか
サイトはIIS 6.0にあります。 301リダイレクトの使用を検討しましたが、ユーザーがブックマークしたページを知る方法がなく、数百ページあるため、301の作成に時間をかけることに熱心な人はいません。
解決
基本的に、カスタム404エラー処理ページで要求するのと同じことを行います。 IIS 6では、元のURLはクエリ文字列に含まれています。以下のコードは、元のURLを取得してユーザーを転送する方法を示しています。私の場合、古いASPから新しいASP.NETに切り替えたため、すべての.aspページを.aspxページに転送する必要がありました。また、一部のURLが変更されたため、古いURLでキーワードを探して転送します。
//did the error go to a .ASP page? If so, append x (for .aspx) and
//issue a 301 permanently moved
//when we get an error, the querystring will be "404;<complete original URL>"
string targetPage = Request.RawUrl.Substring(Request.FilePath.Length);
if((null == targetPage) || (targetPage.Length == 0))
targetPage = "[home page]";
else
{
//find the original URL
if(targetPage[0] == '?')
{
if(-1 != targetPage.IndexOf("?aspxerrorpath="))
targetPage = targetPage.Substring(15); // ?aspxerrorpath=
else
targetPage = targetPage.Substring(5); // ?404;
}
else
{
if(-1 != targetPage.IndexOf("errorpath="))
targetPage = targetPage.Substring(14); // aspxerrorpath=
else
targetPage = targetPage.Substring(4); // 404;
}
}
string upperTarget = targetPage.ToUpper();
if((-1 == upperTarget.IndexOf(".ASPX")) && (-1 != upperTarget.IndexOf(".ASP")))
{
//this is a request for an .ASP page - permanently redirect to .aspx
targetPage = upperTarget.Replace(".ASP", ".ASPX");
//issue 301 redirect
Response.Status = "301 Moved Permanently";
Response.AddHeader("Location",targetPage);
Response.End();
}
if(-1 != upperTarget.IndexOf("ORDER"))
{
//going to old order page -- forward to new page
Response.Redirect(WebRoot + "/order.aspx");
Response.End();
}
他のヒント
方法:
Request.ServerVariables("HTTP_REFERER");
多くのリンクが変更されましたが、URLでパターンを検索することで簡単に修正できます
ユーザーを404に送信するのではなく、URLの書き換えを使用することを検討しましたか?このようにして、ユーザー(およびこの場合あなたにとって重要な場合は検索エンジン)は 301または302を取得します。 404ハンドラを経由する必要はありません。通常、コードを起動してそこで処理するよりも、URLレベルで書き換えを処理する方が、サーバー上でより速く、ストレスが少ないです。
Microsoftは IIS 7のURL書き換えモジュールをリリースしました、およびそれへのきちんとした紹介がありますここおよびこちら。
IIS 6には、ここで優れた入門を使用して、URL書き換えを機能させます。IIS7とは少し異なります。
書き換えルールの例は次のとおりです
# $1 will contain the contents of (.*) - everything after new-dir/
RewriteRule /new-dir/(.*) /find_old_page.asp?code=$1
数百ページあるので、301の作成に時間を費やすことに熱心な人はいません
書き換えルールの利点は、すべてのページを明示的にリストするためにリストする必要はないが、同じパターンに従うルールを作成できることです。最近、これと同様のことをしなければなりませんでしたが、移動したURLの数がいくつかの簡単なルールで処理できるのは驚くべきことです。
404ページを使用する代わりに、 301でリダイレクトするのが適切だと思います-コードを永続的に移動しました。コード。
404ページのinitで行うことは次のとおりです。
Dim AttemptedUrl As String = Request.QueryString("aspxerrorpath")
If Len(AttemptedUrl) = 0 Then AttemptedUrl = Request.Url.Query
AttemptedUrl = LCase(AttemptedUrl)
CheckForRedirects(AttemptedUrl)
CheckforRedirectsには、古いURLと新しいURLを照合するカスタムロジックがあります。
古いシステムの多数のURLを新しいシステムと照合するのに十分な情報を内部に持っている場合、これは(301やURL書き換えではなく)好ましいアプローチであると主張します。古いIDを新しいIDまたは類似のものと一致させるテーブルがある場合。
正規表現を使用して古いURLを新しいURLにマップするために使用できる一貫したパターンがある場合は、URL書き換えがその方法です。
Rewritesの提案に基づいて、UmbracoはすでにUrlRewriting.NETを使用しており、新しい書き換えを追加できます
\config\UrlRewriting.config
これが役立つことを願って
更新、実際に受け取りたい:
VB.NET:
Request.QueryString("aspxerrorpath")
C#:
Request.QueryString["aspxerrorpath"];