2011-02-21 54 views
17

IIS 7で設定したサイトで.aspxページをカスタム404ページとして使用しています。ユーザーがアクセスしようとしていた元のURLを取得する必要があります404ページの処理。このトリックは、.aspx拡張子(たとえばhttp://example.com/testurl)が含まれていない404のASP.NETのカスタムエラーセクションを経由してルーティングされない404を特に処理する必要があることです。カスタム404を指すようにIISを設定できますが、その時点で元のURLを取得する方法はわかりません。これが可能なら誰でも知っていますか?IIS7 404リダイレクトページの元のURLにアクセス

おかげで、

マイク

+1

問題がありましたか?必要に応じて私の答えを明確にすることを嬉しく思います。 – rsbarro

答えて

24

はい、あなたがちょうどあなたが適切に構成IISを持っていることを確認する必要があり、404エラーが発生するURLを取得することが可能です。

処理する必要があるケースは2つあります.1つは.NETで処理される.aspxや他のページからのエラーで、もう1つは問題のあるフォルダからのエラーです、http://example.com/testurl)またはファイル名(例:* .htm)。これは.NETで処理されません。 IIS 7では、Webアプリケーションの「ASP.NET」セクションの「.NETエラーページ」と「IIS」セクションの「エラーページ」の下にカスタム404エラーを設定する必要があります。

<system.web> 
    <!-- other system.web stuff --> 
    <customErrors defaultRedirect="/Error404.aspx" mode="On" redirectMode="ResponseRewrite"> 
     <error redirect="/Error404.aspx" statusCode="404" /> 
    </customErrors> 
</system.web> 
<system.webServer> 
    <!-- other system.webServer stuff --> 
    <httpErrors errorMode="Custom"> 
     <remove statusCode="404" subStatusCode="-1" /> 
     <error statusCode="404" prefixLanguageFilePath="" path="/Error404.aspx" responseMode="ExecuteURL" /> 
    </httpErrors> 
</system.webServer> 

注:あなたは404ページが実際に404件のメッセージを返すようにしたい場合は、上記のredirectMode =「ResponseRewrite」が重要であると私はそれができるとは思わないweb.configファイルの変更は、このような何かを探して終わりますIISによって設定されます。

私の例では、404エラーをすべて処理するためにError404.aspxというページを作成しました。 .NETページ(.aspxなど)が404例外をスローすると、元のファイル名はaspxerrorpathクエリ文字列変数にあります。通常のhtmやその他のページで404エラーが発生すると、元のパスをRequest.RawUrlプロパティから読み取ることができます。私はどちらかのケースを処理するために、私のError404.aspxページに次のコードを使用:

public partial class Error404 : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     OriginalUrl = Request.QueryString["aspxerrorpath"] ?? Request.RawUrl; 
     Server.ClearError(); 
     Response.Status = "404 not found"; 
     Response.StatusCode = 404; 
    } 

    public string OriginalUrl { get; private set; } 
} 

をデフォルトでは、404エラーページが404のステータスコードを返しませんので、あなたはそれを手動で設定する必要があります。詳細はthis postを参照してください。

+1

ありがとうございました。この記事との組み合わせです。http://www.agilewebtechnologies.com/blog/post/2007/11/18/Redirects-Using-404-Error-Handling-in-ASPNET-20-on-共有ホスティング - (パート-4).aspxを使用して301のリダイレクトに変換します。 Response.AddHeader( "Location"、OriginalUrl);を追加しました。 Response.End(); Error404であなたのコードの最後に仕事をする。 – Dave

+1

あなたの明確で詳細な回答に感謝します。私はマイクロソフトのウェブサイトでこのようなものを見つけられず、1時間以上を無駄にしました。 – dvdmn

関連する問題