1

最近、Web サイトを新しい CMS (Umbraco) に移行しました。かなりのリンクが変更されていますが、URLのパターンを検索することで簡単に修正できるので、古いページが見つからなかった場合に正しいページにリダイレクトされるようなものを書きたいと思います。その部分は問題ありません。

ブラウザがカスタム 404 ページにリダイレクトされた後、要求された URL を取得するにはどうすればよいですか。私は使用してみました:

request.ServerVariables("HTTP_REFERER") 'sorry i corrected the typo from system to server.

しかし、それはうまくいきませんでした。

何か案は?

このサイトは IIS 6.0 上にあります。301 リダイレクトの使用を検討しましたが、ユーザーがどのページをブックマークしたかを知る方法がなく、数百ページもあるため、301 の作成に時間をかけようとする人は誰もいません。

4

7 に答える 7

3

カスタム 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();
    }
于 2008-09-29T20:18:18.340 に答える
2

どうですか:

Request.ServerVariables("HTTP_REFERER");
于 2008-09-29T19:48:40.253 に答える
2

多くのリンクが変更されていますが、URL のパターンを検索することで簡単に修正できます。

ユーザーを 404 に送るのではなく、URL の書き換えを検討しましたか? このようにして、404 ハンドラーを経由する必要がなく、ユーザー (および検索エンジンが重要な場合は検索エンジン) が301 または 302を取得します。通常、コードを起動してそこで処理するよりも、URL レベルで書き換えを処理する方が、サーバーへの負担が少なくて済みます。

Microsoft はIIS 7 用の URL Rewrite Module をリリースしました。適切な紹介がここここにあります。

IIS 6 の場合、IIS7 とは少し異なり、URL 書き換えを動作させるための適切な紹介がここにあります。

書き換えルールの例は次のとおりです。

# $1 will contain the contents of (.*) - everything after new-dir/
RewriteRule /new-dir/(.*) /find_old_page.asp?code=$1 

数百ページあるので、301 の作成に時間を費やすことに熱心な人は誰もいません。

書き換えルールの優れた点は、すべてのページを明示的にリストするためにリストする必要がなく、同じパターンに従うルールを記述できることです。最近、これと似たようなことをしなければなりませんでしたが、移動した URL の多くがいくつかの単純なルールで処理できたことに驚きました。

于 2008-09-29T19:51:04.210 に答える
1

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 の書き換えが適しています。

于 2008-09-29T20:34:40.253 に答える
1

Rewrites の提案に基づいて構築するために、Umbraco は既に UrlRewriting.NET を使用しており、新しい rewrites をに追加できます。

\config\UrlRewriting.config

お役に立てれば

于 2008-10-27T13:28:56.510 に答える
1

404 ページを使用する代わりに、 301 - Moved Permanentlyコードでリダイレクトするのが適切だと思います。

于 2008-09-29T19:53:32.020 に答える
0

更新、実際にピックアップしたい:

VB.NET:

Request.QueryString("aspxerrorpath")

C#:

Request.QueryString["aspxerrorpath"];
于 2008-09-29T19:48:32.173 に答える