Stack OverflowのようなクリーンなURLを取得するにはどうすればよいですか?

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

質問

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

スタックオーバーフローは、特定の例を使用するために、の形式の質問URLを使用しますStackoverflowのようなクリーンなURLを取得するにはどうすればよいですか。これは、検索エンジン用にページを最適化する素晴らしい方法です。

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

役に立ちましたか?

解決

ASP.Net MVCで、.Netルーティングが多少組み込まれています。ただし、ルーティングはMVC以外のプロジェクトでも使用できます

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

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

他のヒント

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

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

URLは、 REST原則に続く形式で、すべてがリソースであり、一意のURL。

ブログのどこかで、 ASP.NET MVCフレームワーク

Stack Overflowは、おそらくURL書き換えシステムが組み込まれているASP.NET MVCフレームワークを使用していることを知っています。 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 ルールにも当てはまります。

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>

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

<configuration>
...
   <system.webServer>
      <modules runAllManagedModulesForAllRequests="true" />
   </system.webServer>
</configuration>
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top