我在我的 Web 服务器上运行一个带有两个自定义模块的 Orchard CMS 实例,ModuleFirst
并且ModuleSecond
. 出于某种原因,我希望这两个网站充当具有自己的域和主页的独立网站。我无法设置其他网站或使用 Orchard 的内置租户功能。
我有的
我实现这一目标的方法如下:
- 在 IIS 中向我的网站添加了两个绑定:
first-domain.com
和second-domain.com
实现了一个 ThemeSelector(我认为它就像一个 ActionFilter),它根据传入请求中 Url 的主机切换主题
if (host.Contains("second-domain.com")) { useSecondTheme = true; }
- 确保所有路线都是唯一的
这在大多数情况下运作良好。我可以导航到first-domain.com/foo
并且second-domain.com/bar
看起来我在不同的网站上。
问题
对于这两个“主页”,我无法制作独特的路线,因为我不想添加任何后缀。这两个项目都定义了一条空白路线,应该通向它们各自的主页/索引,但我不知道如何使它工作。
new RouteDescriptor {
Priority = 90,
Route = new Route(
"",
new RouteValueDictionary { // Defaults
{"area", "ModuleFirst"},
{"controller", "Home"},
{"action", "Index"},
},
new RouteValueDictionary(), // Constraints
new RouteValueDictionary { // Datatokens
{"area", "ModuleFirst"}
},
new MvcRouteHandler())
}
new RouteDescriptor {
Priority = 100,
Route = new Route(
"",
new RouteValueDictionary { // Defaults
{"area", "ModuleSecond"},
{"controller", "Home"},
{"action", "Index"},
},
new RouteValueDictionary(), // Constraints
new RouteValueDictionary { // Datatokens
{"area", "ModuleSecond"}
},
new MvcRouteHandler())
}
我试过的
我尝试实现一个 ActionFilter,ModuleFirst/Home/Index
当带有主机 url 的请求first-domain.com
到达时重定向到,ModuleSecond/Home/Index
但这显然不起作用,因为它只是一遍又一遍地击中最高优先级的路由并破坏网站。
我还尝试在具有最高优先级的路由上实现自定义 RouteConstraint 以阻止所有不是来自其预期域的传入请求,假设这些请求随后会退回到较低优先级的路由。
public class SecondConstraint : IRouteConstraint
{
public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
{
return httpContext.Request.Url.DnsSafeHost.Contains("second-domain.com");
}
}
使用如下:
new RouteDescriptor {
Priority = 100,
Route = new Route(
"",
new RouteValueDictionary { // Defaults
{"area", "ModuleSecond"},
{"controller", "Home"},
{"action", "Index"},
},
new RouteValueDictionary { // Constraints
{"isSecond", new SecondConstraint()}
},
new RouteValueDictionary { // Datatokens
{"area", "ModuleSecond"}
},
new MvcRouteHandler())
}
我现在可以导航到second-domain.com
很好并获得正确的页面,但导航到first-domain.com
超时。不过,我还没有设法在 Orchard 中找到任何 RouteConstraints 示例,所以也许我做错了。