22

一部の .NET 駆動型サイトでは、URL が default.aspx などの asp.net ページ名で終わらず、代わりにパターンhttp://sitename.comまたはhttp://sitename.com/subdirectory/subdirectoryを使用します。サイトは、ルートから離れたサブディレクトリとしてマップされます。/tags、/users、/badges の場合、URL はそれぞれ /tags、/users、/badges になります。

スタック オーバーフローは、特定の例を使用すると、次の形式の質問 URL を使用します。. これは、検索エンジン向けにページを最適化する優れた方法です。

これは HTTP ハンドラを使用して実装されていますか? GET リクエストはパスに基づいてフィルタリングされ、応答全体は質問 ID に基づいてハンドラー自体で形成されますか? 他に推測してみたい人はいますか?

4

5 に答える 5

23

これは ASP.Net MVC であり、多かれ少なかれ .Net ルーティングが組み込まれています。ルーティングは MVC 以外のプロジェクトでも利用できますが、

http://msdn.microsoft.com/en-us/library/cc668201.aspx

binフォルダーにドロップできるのは単なる.dllです。基本的に、正規表現を使用して URL をページ/テンプレートに一致させます。

于 2009-06-23T21:11:59.340 に答える
18

これは、Apache のmod_rewrite 、またはIIS の url_rewritingの同様の方法で実現されます。

注: SOFlow は後者を使用します。

于 2009-06-23T21:11:24.677 に答える
5

URL は、すべてが一意の URL を持つリソースであるというREST 原則に従って、その形式になっています。

ブログのどこかで、これはASP.NET MVC フレームワークを使用して実現されていると読んだと思います。

于 2009-06-23T21:12:51.443 に答える
3

Stack Overflow が ASP.NET MVC フレームワークを使用していることは知っていますが、これにはおそらく URL 書き換えシステムが組み込まれています。Windows 以外のシステムでは、Apache mod_rewrite が非常に一般的です。

たとえば、wiki ページ:http://server.com/wiki/Main_Pageリクエストは Web サーバーによって処理されます。に訳されています/wiki/index.php?page=Main_Page

Apache での URL 書き換えの例を次に示します。

RewriteEngine on
RewriteRule ^forum-([0-9]+)\.html$ forumdisplay.php?fid=$1 [L,QSA]
RewriteRule ^forum-([0-9]+)-page-([0-9]+)\.html$ forumdisplay.php?fid=$1&page=$2 [L,QSA]

RewriteRule ^thread-([0-9]+)\.html$ showthread.php?tid=$1 [L,QSA]
RewriteRule ^thread-([0-9]+)-page-([0-9]+)\.html$ showthread.php?tid=$1&page=$2 [L,QSA]

これが言っているのは、入ってくる URL が であるかのようにforum-##.htmlその要求を処理する場合forumdisplay.php?fid=##です。thread-##.htmlルールについても同様です。

于 2009-06-23T21:12:46.063 に答える
0

を使用して ASP.net で実行できますContext.RewritePath

Global.asaxで、Application.BeginRequestイベント ハンドラーを作成します。

たとえば、

example.com/questions

実際に結果を返す

example.com/Questions/Default.aspx

Global.asax :

<%@ Application Language="C#" %>
<script runat="server">

   void Application_BeginRequest(Object sender, EventArgs e)
   {
       string originalPath = HttpContext.Current.Request.Path.ToLower();

       if (originalPath.Contains("/questions"))
       {
           String newPath = originalPath.Replace("/questions", "/Questions/Questions.aspx");
           Context.RewritePath(newPath);
       }
    }
</script>

runAllManagedModulesForAllRequestsWeb サイトで .NET Framework 4 より前のものを実行している場合は、手動でweb.configをオンにする必要があります。そうしないと、BeginRequestイベントが発生しません。

<configuration>
...
   <system.webServer>
      <modules runAllManagedModulesForAllRequests="true" />
   </system.webServer>
</configuration>
于 2016-04-04T00:52:55.560 に答える