MVC3 Web サイトを作成しようとしています。少なくとも 2 つのエリアが必要ですが、エリアごとに異なる URL が必要です。このような:
domain.com/ は / に移動します
admin.domain.com/ は /areas/admin に移動します
anotherSite.com/ は /areas/portal に移動します
いくつかの調査を行った後、次のように HostNameContraint を使用できるというLucero のリンクを見つけました。
public class HostNameContraint : IRouteConstraint
{
protected string _hostname;
public HostNameContraint(string hostname)
{
_hostname = hostname;
}
bool IRouteConstraint.Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
{
if (httpContext.Request.Url.Host == _hostname)
return true;
return false;
}
}
次に、次のように制約を登録します。
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { area = "", controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
new { hostname = new HostNameContraint("domain.com") },
new[] { "MVCProject.Controllers" }
);
routes.MapRoute(
"Admin_Default2", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { area = "Admin", controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
new { hostname = new HostNameContraint("admin.domain.com") },
new[] { "MVCProject.Controllers.Areas.Admin.Controllers" }
);
routes.MapRoute(
"Portal_Default2", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { area = "Portal", controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
new { hostname = new HostNameContraint("anotherSite.com") },
new[] { "MVCProject.Controllers.Areas.Portal.Controllers" }
);
各サイトのアプリケーションのルート フォルダーを指すように IIS をセットアップしました。ルート "Domain.com" を指定すると問題なく動作しますが、"Admin.domain.com" または "Domain.com/admin/" に移動すると、404 "リソースが見つかりません" が表示されます。
更新 URLの先頭にエリア名がある場合とない場合の両方で試しました。
"ポータル/{コントローラー}/{アクション}/{id}"
問題は、「Portal」エリアがルートにある場合、署名が「anotherSite.com」の名前と一致しないため、返されて 403.14 - Forbidden と表示されることです。このディレクトリの内容を一覧表示できません。「Portal」領域が url パラメータの場合、HostNameConstraint のコンストラクタは呼び出されないことに注意することも重要です。