Stack OverflowのようなクリーンなURLを取得するにはどうすればよいですか?
-
10-07-2019 - |
質問
一部の.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
ルールにも当てはまります。
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>