【问题标题】:How can I host multiple websites in IIS 7 and use the same MVC application for all them?如何在 IIS 7 中托管多个网站并为所有网站使用相同的 MVC 应用程序?
【发布时间】:2013-04-11 02:18:52
【问题描述】:

如何在 IIS 7 中托管多个网站并为所有网站使用相同的 MVC 应用程序,以便每个网站:

  1. 拥有自己的根目录,因此用户可以上传自己的文件(html、css、javascript)而无需查看其他网站的内容

  2. 使用相同的 MVC 应用程序 - 因此应用程序的更新会影响所有站点

  3. 用户不能以任何方式影响 MVC 应用程序(最好对他们隐藏)

谢谢!

【问题讨论】:

    标签: asp.net-mvc-4 iis-7.5


    【解决方案1】:
    1. 创建一个用于部署 MVC 文件的目录,名为“AppFoo”。请注意,配置文件 web.config 将在所有站点之间共享,您必须在按需运行时通过查看 Host HTTP 标头或其他绑定信息来加载每个站点的配置。
    2. 在 IIS 中创建每个网站并让它使用您创建的应用程序目录。理想情况下,每个网站都在自己的应用程序池下运行,并拥有自己的用户帐户,所有用户帐户都可以访问 AppFoo 目录。
    3. 在某处创建一个新目录,例如在C:\Inetpub\sites\ 下命名为WebsiteAWebsiteB 等。每个文件夹都重新设置了只允许每个网站的应用程序池用户访问的NTFS 权限ACL。在这些文件夹中创建名为“Content”、“Views”和“Logs”的文件夹
    4. 为 IIS 中的每个网站(我假设您使用的是根)设置一个名为“内容”和“视图”的虚拟目录(我假设您已经设置了 MVC 应用程序),将它们映射到您在第 3 步中创建的文件夹的子目录。
    5. 对于每个网站,转到日志记录页面并将日志路径设置为您在步骤 3 中为该网站创建的Logs 目录。

    请注意,此计划基于 MVC 在其 VirtualPathProvider 中评估 IIS 虚拟目录的假设。如果没有,那么您将不得不滚动您自己的 VirtualPathProvider 以再次基于每个主机名加载每个网站的内容。

    【讨论】:

    • 谢谢戴!对于第 2 点,如何设置每个站点使用应用程序目录?
    • 它位于树形视图中网站节点的“基本设置”下。
    • 你的意思是把网站的根目录指向MVC app文件夹还是在根目录下添加一个应用程序?
    • 第一个。所以所有网站共享同一个文件系统目录(至少对于应用程序文件),用户可编辑的目录是虚拟的并映射到它们自己的文件夹。请注意,用户将无法编辑网站的根目录,因此除非您将应用程序放在虚拟子目录中,否则自定义 google 验证页面将不起作用。
    • 谢谢戴 - 我已经尝试了你的建议,除了根目录限制之外它确实有效。我已经尝试过第二种方法,其中应用程序由虚拟目录引用,但这会产生一个我似乎无法解决的 global.asax 错误。你能看看这个问题吗:stackoverflow.com/questions/15961052/…。谢谢!!!
    【解决方案2】:

    如果您正在运行一个代码库,则设置一个使用domain routing 或全局过滤器的站点来捕获域、保存它并将其用作文件夹的键等...

    public class DomainFilterAttribute : ActionFilterAttribute
    {
        private SiteDomainRepository _siteDomainRepository = new SiteDomainRepository();
    
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            var viewBag = filterContext.Controller.ViewBag;
            var host = HttpContext.Current.Request.IsLocal ? "www.testdomain.com" : HttpContext.Current.Request.Url.Host;
            var domain = hostSplit[1];
    
            var siteDomain = _siteDomainRepository.GetByRowKey(domain);
    
            viewBag.DomainName = host.ToLower();
            viewBag.Domain = siteDomain.RowKey;
            viewBag.Class = siteDomain.Key;
            viewBag.TrackingCode = siteDomain.TrackingCode;
        }
    }
    

    【讨论】:

    • 谢谢,但这如何让我为每个网站提供单独的根目录?
    • 您不需要单独的根目录 - 本质上,每个域都会在根目录中拥有一个文件夹,并且无法访问该文件夹 - 由您的应用程序控制。
    • 我想要一个单独的根目录,以便用户可以上传自己的谷歌验证页面,或者网站图标或其他文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-10
    • 2019-07-20
    • 1970-01-01
    • 2021-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多