ASP.NET 経由で拡張子のない URL をリダイレクトおよび変更するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/121813

質問

複数のビジネスユニットを含む Web サイトの構造を再設計しました。次に、(301) を新しいページにリダイレクトしたいと思います。

IE:
www.example.com/abc でした
現在 www.example.com/default.aspx?article=abc

これを行うために Global.asax を使用しようとしましたが、デバッグすると正常に動作しました。

        if (Request.RawUrl.Contains("abc"))
        {
            Response.RedirectLocation = "/default.aspx?article=abc";
            Response.StatusCode = 301;
            Response.StatusDescription = "Moved";
            Response.End();
        }

それで http://localhost:1234/example/abc 適切にリダイレクトされますが、(1234 はデバッグ サーバーのポートです)
http://localhost/example/abc リダイレクトされず、404 が返されます。

何か案は?


追加情報:行ったら http://localhost/example/abc/default.aspx その後、適切にリダイレクトされます。

役に立ちましたか?

解決

そうですね、ポートが組み込み Web サーバー (VS に付属の Web サーバー) を使用していることを示している場合、これはおそらく機能します。 いつも ASP.NET フレームワークを通じてリクエストをルーティングします。

/abc で終わる要求は、ASP.NET フレームワークを介して自動的にルーティングされません。これは、IIS が要求を「認識」していない可能性があるためです。IIS 設定をチェックして、そのような要求が aspnet_isapi.dll にルーティングされていることを確認する必要があります。


編集: これを実現するには、 ワイルドカードマッピング:

  1. IIS マネージャーで、ローカル コンピューターを展開し、[Web サイト] フォルダーを展開し、目的の Web サイトまたは仮想ディレクトリを右クリックして、[プロパティ] をクリックします。
  2. 適切なタブをクリックします。ホーム ディレクトリ、仮想ディレクトリ、またはディレクトリ。
  3. [アプリケーション設定] 領域で、[構成] をクリックし、[マッピング] タブをクリックします。
  4. ワイルドカード アプリケーション マップをインストールするには、次の手順を実行します。
    • [マッピング] タブで、[追加] または [挿入] をクリックします。
    • [実行可能ファイル] テキスト ボックスに DLL へのパスを入力するか、[参照] をクリックしてその DLL に移動します (たとえば、ASP.NET 2.0 DLL は、私の環境では c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll にあります)機械)
    • 拡張子には、もちろん引用符なしで「.*」を使用します
    • 検索する動詞を選択します (ASP.NET では GET、HEAD、POST、DEBUG が一般的です。決めるのはあなたです)
    • 「スクリプト エンジン」または「アプリケーション エンジン」が選択されていることを確認します。
    • 「ファイルの存在を確認する」のチェックを外します
    • 「OK」をクリックします。

私はこれについて間違っているかもしれませんが、もし間違っている場合は、誰かが私を修正してくれることを願っています。:)

他のヒント

IIS ワイルドカード リダイレクトを使用する必要があります。次のようなものが必要になります。

 *; www.example.com/*; www.example.com/default.aspx?article=$0

合理的な参照先があります マイクロソフト

Apache を使用している場合は、htaccess ファイルを変更する必要があると思います。

現在、Visual Studio Web サーバーでサイトをテストしていますか?これは通常、「localhost:nnnnn」でサイトを実行します。「nnnnn」はポート番号 (上記のように 1234) であり、ポートなしで実行するように設定することはありません。

該当するマシンに IIS がインストールされている場合は、そのマシンにプロジェクトを公開すると、「nnnnn」なしで動作することを確認できるはずです。コード内に動作しない原因となるものはないようです。そうする。

web.config ファイルが各 Web サイトで同じであることを確認しましたか (:1234 が :80 と異なると仮定します)

また、localhost:80は試しましたか?

あなたの http://localhost/example/abc 期待どおりに Global.asax を呼び出していません。通常 http://ローカルホスト ポート 80 (:80) で実行されています。ポート 80 でサイトを実行する場合は、サイトを IIS に展開してここで実行する必要があります。

すべての未知の拡張子を asp.net に転送するには、IIS でハンドラー マッピングを設定する必要があります。1 つ目は、cassini がすべてのリクエストを処理しているため機能します。2 つ目は、.net フレームワークがコードを実行する代わりに、IIS がそのディレクトリを探しているが存在しないため、機能しません。

やり方についてはこちら asp.net での URL の書き換え.

ただし、可能であれば、新しいものを使用することをお勧めします アプリケーションリクエストのルーティング または URL書き換え.net

IIS は、デフォルトでは、すべての要求を処理のために ASP.NET に引き渡すわけではありません。「aspx」などの一部のリソース拡張子のみが、処理のために asp.net に渡されます。リクエストすると何が起こっているのか http://localhost/example/abc IIS は、デフォルトのファイルがあるかどうかを確認するためにディレクトリを見つけようとします (つまり、default.aspx、index.html) をそのディレクトリからロードします。ジャンクの「abc」タグが含まれるディレクトリが見つからないため、ロードするdefault.aspxファイルも見つかりません。

ロードしようとすると http://localhost/example/abc/default.aspx, IIS は「aspx」拡張子を認識し、それを処理のためにすぐに ASP.NET ランタイムに渡します。その理由は、 http://localhost/example/abc リクエストが読み込まれないということは、リクエストが ASP.NET に渡されないということなので、もちろん global.asax はリクエストを認識しません。

Cassini がホストするサイトはすべての要求を処理するため、その呼び出しは ASP.NET と global.asax ファイルによって処理されます。

私は、未知の拡張機能を ASP.NET に転送するには、IIS でハンドラー マッピングを設定する必要があると提案した Darren Kopp 氏に同意します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top