0

私は URL の書き換えに取り組んでおり、asp.net サイトで 1 つのチュートリアルを見つけました。

入力している URL http://localhost:1573/WebNew/web/first-web

今、私は1つのクラスを書きました

public class FixURLs : IHttpModule 
{
    public FixURLs()
    {
        //
        // TODO: Add constructor logic here
        //
    }

    #region IHttpModule Members

public void Dispose()
{
    // do nothing
}

public void Init(HttpApplication context)
{
    context.BeginRequest += new EventHandler(context_BeginRequest);
}

#endregion

void context_BeginRequest(object sender, EventArgs e)
{
    HttpApplication app = (HttpApplication)sender;

    /*// checking page extension
    switch (System.IO.Path.GetExtension(app.Request.Url.AbsoluteUri.ToLower()))
    {
        case ".bmp":
        case ".gif":
        case ".jpg":
        case ".jpe":
        case ".jpeg":
        case ".png":
        case ".css":
        case ".js":
        case ".txt":
        case ".swf":
            // don't redirect, these requests may required in many cases
            return;
            break;
    }*/

    if (app.Request.RawUrl.ToLower().Contains("/web/"))
    {
        **if (app.Request.RawUrl.ToLower().Contains(".png")
              || app.Request.RawUrl.ToLower().Contains(".gif")
              || app.Request.RawUrl.ToLower().Contains(".js"))
        {
            return;
        } **
        DatabaseLayer dbLayer = new DatabaseLayer();

        string urlFromBrowser = app.Request.RawUrl.ToLower();
        string[] urlFormat = urlFromBrowser.Split('/');
        urlFromBrowser = urlFormat.GetValue(2).ToString() + "/" + urlFormat.GetValue(3).ToString();

        int WebId = dbLayer.GetWebURLId(urlFromBrowser.Trim());

        app.Context.RewritePath("Default.aspx", "", "WebId="+WebId);

    }
}

しかし問題は、Default.aspx ページにリダイレクトされないことです。

以下のエラーが表示されます。

説明: HTTP 404。探しているリソース (またはその依存関係の 1 つ) は、削除されたか、名前が変更されたか、一時的に利用できない可能性があります。次の URL を見直して、スペルが正しいことを確認してください。

要求された URL: /WebNew/web/Default.aspx

URL /webNew/web/Default.aspx を要求していることがわかりますが、必要なのは /webnew/default.aspx?WebId=2 だけです

助けてください

編集

回答ありがとうございます。回答を受け入れることができず、コメント ボタンが機能していないため、投稿を編集しています。JavaScript エラーが発生しています: Object expected and Object question is null. ここに画像の説明を入力

@Waqas Rajaご回答ありがとうございます。現在は正常に動作しています。しかし、Default.aspx ページの (!IspostBack) イベントにブレークポイントを配置すると、約8回来ていることがわかります。ページを読み込んだ後、いくつかの画像がなくなりました。複数の更新が問題ですか? if(!IsPostBack) イベントに何度も何度も行く理由。ご協力いただきありがとうございます

編集1

@Waqas Raja別のブラウザからログインした後、回答を受け付けます。

EDIT2

@Waqas Raja このようにホームページに画像を表示しています

このように表示されている画像は他にもいくつかあります。正常にロードするとすべて正常に表示されますが、URL 書き換えを使用している場合は代替テキストしか表示されません。

私もこれを試しました

でも同じ結果。:-( なにか提案を?

生のURLを確認すると、あなたが言及したように、ページ以外のリクエスト、つまりjpg、.jsがたくさんあることがわかります。コードを更新しましたが、正しいですか? 画像が見えず、javascript 機能が少ないためです。

EDIT3

@Waqas Raja ご協力ありがとうございます。画像が見れるようになりました。HTML 画像を asp:Image controla に削除し、ImageURL を ~/images/facebook_icon.png のままにしました。

しかし、ページに JS ファイルの効果がまだ表示されません。src="~/JS/jQuery.js" を配置しましたが、まだ機能していません。あなたが言及したコードを私のクラスに配置しました [ちょうどあなたが私を導いてくれた場所]。

4

1 に答える 1

1

問題は書き換えパスにあります。次のパスに置き換えてください

app.Context.RewritePath("~/webnew/Default.aspx", "", "WebId=" + WebId);

編集 1要件が変更されましたが、何が問題なのかを説明させてください。

問題は、画像の相対パスにある必要があり、外部の JavaScript と CSS の場合にも発生する可能性があります。

ルート ディレクトリからの相対パスを使用する必要があります。

~リソース (通常はページまたは場合によっては外部 css) がアクセスされている仮想ディレクトリのルート ディレクトリを指します。

~/pathToImagesFolder/imageName.ext

javascript と css を含め、Web サイトのホーム ディレクトリまたは仮想ディレクトリからの相対パスを使用する場合は注意が必要です。ただし、css 内では、この点に関して実行する必要のある手順はありません。

IsPostBack問題について

問題はif条件にあると思います

if (app.Request.RawUrl.ToLower().Contains("/web/"))

ここでは、URL に含まれるすべてのリクエストをリダイレクトしてい/web/ます。おそらくページ内では、URL に含まれる画像や外部 css や js などのリソースにアクセスしている/web/ため、リクエストが到達すると、default.aspx にリダイレクトされ、問題が発生します。上げます。イベントで調べることで確認できRequest.RawUrlますPage_LoadDefault.aspx

したがって、要求されたリソース パスとリダイレクトを比較するときは、さらにチェックが必要です。.css .jpg .JPG .js .gifなどの拡張子で終わるすべての URL のリダイレクトをチェックしてスキップすると、より美しくなります。

あなたの理解が今構築されることを願っています。

編集 2他のすべての拡張子をスキップする必要があります

// checking page extension
switch (System.IO.Path.GetExtension(app.Request.Url.AbsoluteUri.ToLower()))
{
    case ".bmp":
    case ".gif":
    case ".jpg":
    case ".jpe":
    case ".jpeg":
    case ".png":
    case ".css":
    case ".js":
    case ".txt":
    case ".swf":
        // don't redirect, these requests may required in many cases
        return;
        break;
}
于 2011-03-23T09:58:34.227 に答える