3

サイトで URL 書き換えを使用して、http: //mysite.com/index.aspx?user=john ではなく
http://mysite.com/users/johnのような URL を取得しています

IIS6 でこの拡張子のない書き換えを実現し、ホスティング サーバーにアクセスできないようにするために、「404 アプローチ」を使用します。サーバーが見つからないリクエストの場合、マップされた 404 ページが実行されます。これは aspx ページであるため、書き換えを実行できます (ホスティング サービスのコントロール パネルを使用して 404 マッピングをセットアップできます)。

Global.asax のコードは次のとおりです。

protected void Application_BeginRequest(object sender, EventArgs e)
{
    string url = HttpContext.Current.Request.Url.AbsolutePath;
    if (url.Contains("404.aspx"))
    {
        string[] urlInfo404 = Request.Url.Query.ToString().Split(';');
        if (urlInfo404.Length > 1)
        {
            string requestURL = urlInfo404[1];
            if (requestURL.Contains("/users/"))
            {
                HttpContext.Current.RewritePath("~/index.aspx?user=" + GetPageID(requestURL));              
                StoreRequestURL(requestURL);
            }
            else if (requestURL.Contains("/picture/"))
            {
                HttpContext.Current.RewritePath("~/showPicture.aspx?pictureID=" + GetPageID(requestURL));
                StoreRequestURL(requestURL);
            }
        }
    }
}

private void StoreRequestURL(string url)
{
    url = url.Replace("http://", "");
    url = url.Substring(url.IndexOf("/"));
    HttpContext.Current.Items["VirtualUrl"] = url;
}

private string GetPageID(string requestURL)
{
    int idx = requestURL.LastIndexOf("/");
    string id = requestURL.Substring(idx + 1);
    id = id.Replace(".aspx", ""); //Only needed when testing without the 404-approach
    return id;
}

そして、マスターページの Page_Load で、フォームタグのアクション属性に正しい URL を設定しました。

protected void Page_Load(object sender, EventArgs e)
{
    string virtualURL = (string)HttpContext.Current.Items["VirtualUrl"];
    if (!String.IsNullOrEmpty(virtualURL))
    {
        form1.Action = virtualURL;
    }
}

書き換えは正常に機能しますが、ページでポストバックを実行すると、ポストバックが実行されません。これはどうにかして解決できますか?

問題は404アプローチにあるようです.404アプローチなしで試してみると(そしてエクステンションレス機能が失われると)ポストバックが機能するからです。それが私が要求するときです:
http://mysite.com/users/john.aspx

これを解決できますか、それとも私の要件を満たす他のソリューションがありますか (IIS6、サーバーアクセス/ISAPI フィルターなし、拡張機能なし)。

4

7 に答える 7

9
form1.Action = Request.RawUrl

と組み合わせて

HttpContext.Current.RewritePath("/Default.aspx", true); 

私にとってはとてもうまくいきます。

フォームの Action 属性の設定は、私が欠けていた部分でした...

解決策をありがとう!!!

于 2010-08-08T10:01:00.797 に答える
4

Scott Guthrie は、IIS にアクセスせずにこれを行うさまざまな方法について説明しています。

http://weblogs.asp.net/scottgu/archive/2007/02/26/tip-trick-url-rewriting-with-asp-net.aspx

個人的には、過去に HTTPModules を作成したことがありますが、非常に簡単に組み立てることができます。

于 2009-01-04T15:57:53.223 に答える
3

form1.Action = Request.RawUrl も C# で書かれている方法です ページロードメソッドに入れます

于 2010-02-22T13:15:02.150 に答える
1

次のようなものを試してください:

            if (Request.HttpMethod == "GET" && shouldChangeUrl)
            {
                urlRedirect = "REAL-URL-HERE";

                _postBackUrl = urlRedirect;
                Context.RewritePath(urlRedirect);
            }
            else
                //If Post Back (Request.HttpMethod="POST")
                Context.RewritePath(_postBackUrl);

したがって、URLを書き換えるときに、ポストバックの実際のURLを変数(ここでは_postBackUrl)に保存し、ポストバック時にのみ使用します。

于 2010-04-19T10:49:10.173 に答える
1

代わりに以下を使用できます。

form1.Action = Request.RawUrl

それがC#でどうなるかはわかりませんが、これはVBでのものであり、うまく機能します

于 2009-11-23T22:38:06.220 に答える
1

Live Http Headersをインストールすることから始めて、Http リクエストで何が起こっているかを確認します。

ああ、その記事で説明されていますが、フォームタグのアクション属性が間違っているようです:

ASP.NET と Url-Rewriting を使用するときによく遭遇する 1 つの落とし穴は、ポストバック シナリオの処理に関係しています。具体的には<form runat="server">、ページにコントロールを配置すると、ASP.NET はデフォルトで、マークアップの "action" 属性を自動的に出力して、それが存在するページをポイントします。URL 書き換えを使用する場合の問題は、コントロールがレンダリングする URL が要求の元の URL (例: /products/books) ではなく、書き換えられたもの (例: /products.aspx?category) であることです。 =本)。これは、サーバーへのポストバックを行うと、URL がクリーンな URL にならないことを意味します。

ASP.NET 1.0 および 1.1 では、コントロールをサブクラス化<form>し、使用するアクションを正しく出力する独自のコントロールを作成することがよくありました。これは機能しますが、最終的には少し厄介になります。これは、この代替フォーム コントロールを使用するにはすべてのページを更新する必要があり、Visual Studio WYSIWYG デザイナーで問題が発生する場合があるためです。

幸いなことに、ASP.NET 2.0 には、<form>コントロールの "action" 属性を書き換えるために使用できる、よりクリーンなトリックがあります。具体的には、新しい ASP.NET 2.0 コントロール アダプター拡張アーキテクチャを利用して、<form>コントロールのレンダリングをカスタマイズし、指定した値でその "action" 属性値をオーバーライドできます。これにより、.aspx ページのコードを変更する必要はありません。代わりに、.browser ファイルを /app_browsers フォルダーに追加して、新しい「アクション」属性を出力するために使用するコントロール アダプター クラスを登録します。

于 2009-01-04T15:59:57.540 に答える
0

問題は 404 処理内にあります。フォームが存在しないページに投稿されている場合、ASP.NET は要求を 404 ページにリダイレクトするため、すべてのポストバック データが失われます。

唯一の解決策は、フォームのアクション属性を既存のページに設定することです。これにより、ユーザーがフォームを送信したときに index.aspx?user=john が表示されます。SEO の場合、これは問題にはなりません。クローラーは投稿を発行しないため、醜いアドレスは表示されないからです。

于 2009-05-15T19:37:21.790 に答える