2009-06-23 23 views
21

一部の.NETドリブンサイトでは、URLはdefault.aspxのようにasp.netページ名で終わらない代わりに、パターンhttp://sitename.comまたはhttp://sitename.com/subdirectory/subdirectoryを使用します。サイトは、ルートから離れたサブディレクトリとして、すなわちマップされます。/tags、/ users、/バッジの場合、URLはそれぞれ/ tags、/ users、/バッジになります。スタックオーバーフローのようなきれいなURLを取得するにはどうすればよいですか?

特定の例を使用するために、Stack Overflowは、フォームHow do get clean URLs like Stackoverflow?の質問URLを使用します。検索エンジンのページを最適化するには最適な方法です

これはHTTPハンドラを使用して実装されていますか? GETリクエストはパスに基づいてフィルタリングされていますか?そして、全体のレスポンスは質問IDに基づいてハンドラ自体で形成されますか?他の誰もが推測する気に?

+4

この質問はこれまで何度も尋ねられています。 –

+0

私はbeleiveスタックオーバーフローがASP.NET MVCフレームワークを使用して構築されています.www.asp.net/mvcを参照してください。 – Charlie

+5

SO参照を削除してください。これは大きな質問です。 –

答えて

21

それは多かれ少なかれに建てられた。ネットルーティングを持ってASP.Net MVC、です。それはあなたができるだけの.dllだ

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

もののルーティングは、同様に非MVCのプロジェクトのために利用可能ですあなたのbinフォルダにドロップします。基本的には正規表現を使用してURLをページ/テンプレートに一致させます。

+1

ASP.NET 4.0以降、2009年後半に発表されたWebフォーム用のURLルーティングの統合が強化されました。[ASP.NET 4 WebフォームによるURLルーティング(VS 2010および.NET 4.0シリーズ) - ScottGuのブログ](http: /weblogs.asp.net/scottgu/archive/2009/10/13/url-routing-with-asp-net-4-web-forms-vs-2010-and-net-4-0-series.aspx) – Lumi

18

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

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

+2

なぜ落選ですか? – Sampson

+0

おそらく、サイトがApacheを使用していないことが十分に文書化されているためです。 –

+7

私はそれがApacheを使用していると言いましたか?いいえ。質問者はURLの仕組みに興味がありました。彼は、.NETの観点から彼らがどのように働いているか興味を持っているとは言わなかった。私はApacheとIISの両方に答えを出しました。 – Sampson

3

スタックオーバーフローはASP.NET MVCフレームワークを使用していることがわかりました。おそらくURL書き換えシステムが組み込まれています。非Windowsシステムの場合、Apache mod_rewriteは非常に一般的です。

たとえば、wikiページ:http://server.com/wiki/Main_PageリクエストはWebサーバーによって処理されます。ここではApacheに書き換えURLの例です/wiki/index.php?page=Main_Page

に翻訳されています:入ってくるURLが、それはforumdisplay.php?fid=##であるかのように要求するプロセスforum-##.htmlであれば、これは言う何

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] 

です。 thread-##.htmlのルールも同様です。

5

URLはすべてREST principlesの形式で表示され、すべてが一意のURLを持つリソースです。

私はブログのどこかでASP.NET MVC frameworkを使ってこれを実現していると読んでいます。

0

Context.RewritePathを使用してASP.netで行うことができます。

Global.asaxには、Application.BeginRequestイベントハンドラを作成します。例えば

、あなたが

example.com/questions 

の要求を作りたい場合は、実際に

example.com/Questions/Default.aspx 

グローバルからの結果を返します。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> 

あなたのウェブサイトは、.NET Framework 4の前に何かを実行している場合は、手動runAllManagedModulesForAllRequestsでweb.configファイルをオンにする必要がありますが、そうでない場合はBeginRequestイベントイベントが発生し得ることはありません:

<configuration> 
... 
    <system.webServer> 
     <modules runAllManagedModulesForAllRequests="true" /> 
    </system.webServer> 
</configuration> 
関連する問題