MVC 包和 IIS 虚拟目录(URL 重写)

Posted

技术标签:

【中文标题】MVC 包和 IIS 虚拟目录(URL 重写)【英文标题】:MVC bundles and IIS virtual directories (URL rewrite) 【发布时间】:2015-09-25 17:55:35 【问题描述】:

我在 IIS 服务器虚拟目录上托管多个应用程序,并且我正在使用 URL 重写来简化它们。像 "~/path/to/my/content" 这样手动编写的所有图像和其他资产都有正确的输出 "/path/to/my/content",但像 "~/client/js" 这样的捆绑路径给出的输出 "/myapplication/client/js" 应该是 "/client/js"

我该如何解决这个问题?

我如何启动脚本包:

var scriptBundle = new ScriptBundle("~/client/js");

重写配置:

<rule name="Official Website" stopProcessing="true">
               <match url="(.*)" />
               <conditions>
                  <add input="HTTP_HOST" matchType="Pattern" pattern="^(www\.)?domain\.com$" ignoreCase="true" negate="false" />
               </conditions>
               <action type="Rewrite" url="officialsite/R:1" />
            </rule>

正在研究这些主题,但无法为我做任何事情:

How do I get System.Web.Optimization bundles to work with custom folders in an IIS virtual directory? CssRewriteUrlTransform with or without virtual directory Why does ResolveBundleUrl not work for custom folders? (MVC Beta 4) Is it possible to unit test BundleConfig in MVC4?

更新:我使用 Winhost 作为主机提供商,他们不支持为 IP 设置主机头,可能是由于共享 IP。它们提供指向根文件夹的域指针,这就是我使用 URL 重写的原因。

【问题讨论】:

您告诉我们您正在重写,但您决定不显示您的重写规则?看起来他们可能是问题的一部分。 在我看来,您想使用多个链接到端口 80 并通过主机名进行区分的网站。您不需要为此使用 URL 重写。 this 能成为你所追求的吗? @milanio 嗨,我使用 winhost 作为我的托管服务提供商,我唯一能做的就是将域指针设置为适当的根文件夹。他们不提供像您提供的链接那样设置主机标头。谢谢你。 【参考方案1】:

我有两个选项你可以试试。

1) 尝试使用它来欺骗它使用正确的路径:

var scriptBundle = new ScriptBundle("~/../client/js");

你可能会得到一个HttpException(不能使用前导..退出上面 ***目录。),但值得一试。我无法复制你的 环境,所以我无法测试。

2) 创建您自己的虚拟路径提供程序: Changing ASP.net application root?

【讨论】:

我尝试了您的第一个建议,不幸的是它最终以错误告终。关于第二个建议,我并没有真正掌握VirtualPathprovider 的概念,并且使用提供的示例我无法检索文件。【参考方案2】:

你说:

我在 IIS 服务器虚拟目录上托管多个应用程序 我正在使用 URL Rewrite 来方便他们

所以,问题是指根配置(虚拟目录)可用于捆绑等,而不是捆绑配置或重写规则。我认为您需要将 myapplication 目录设置为虚拟并将其设置为单独的网站。确保您已按照Create Web Site 中的说明进行操作,其中显示:

您在 IIS 中添加一个网站,在 ApplicationHost.config 文件。该条目指定:

    网站的网络绑定 将站点映射到文件系统中的某个位置 (可选)指定用于内容访问的用户凭据

为确保用户请求到达正确的网站,您必须为服务器上的每个站点配置唯一标识。托管在同一服务器上的网站可以使用以下唯一标识符进行区分。

主机头名称(推荐) IP 地址 TCP 端口号

Configure a Host Header for a Web Site (IIS 7) 指向第一个。

更新:我认为服务器和您的项目可能存在名称冲突。更明亮地尝试将~/client/js 中的 client 及其文件夹更改为新文件夹。除非有多个路径选择(具有此路径深度)供服务器获取,否则您可以通过在项目和 js 包映射中添加 \ 来增加额外深度来解决它。

Update2:最后我建议您关注How to publish or host subdomain on winhost.com? 提供的完整文章来解决这个惊人的问题:)

【讨论】:

感谢您的回答。我按照这些说明 (goo.gl/MGceH5) 关于如何创建这些虚拟目录,我能够设置两个具有不同子域的不同站点,并且两个站点上的所有内容都可以正常工作,除了捆绑方面(甚至 html 相对路径 ~/Content 解析为 @ 987654328@ 不是/myapplication/Content,这是我需要的)。例如,如果我从 '/myapplications/client/js?v=123123` 中取出 /myapplication,它会为我获取正确的捆绑 js 文件。 ApplicationHost配置文件,我无权访问,也无法设置IIS绑定。 我拥有的文件夹结构是Content/client/js,但解决的捆绑路径是client/js,它从未发生冲突。需要指出的是,捆绑不仅仅在这种虚拟目录场景中起作用。 @skmasq 默认使用myapplication 而不是content @skmasq 我的最后一次帮助将是我帖子中的第二次更新。祝我的朋友好运。

以上是关于MVC 包和 IIS 虚拟目录(URL 重写)的主要内容,如果未能解决你的问题,请参考以下文章

IIS 重写虚拟文件夹

thinkphp5 Apache / IIs环境下 URL重写

通配符在IIS7 URL重写中没有任何效果

虚拟主机.htaccess伪静态(URL重写)建立多站点

IIS 7.5 中的 Asp.net mvc 4 应用程序问题

将 MVC3 设置为经典 asp 虚拟文件夹下的应用程序 - IIS7