我正在尝试对某些.css和.js文件使用捆绑缩小。我的捆绑包配置如下:
public static void RegisterBundles(BundleCollection bundles)
{
bundles.Add(new ScriptBundle("~/Modernizr").Include(
"~/Scripts/modernizr.js"
));
bundles.Add(new StyleBundle("~/TemplateContent").Include(
"~/Content/bootstrap.css",
"~/Content/bootstrap-responsive.css",
"~/Content/prettyPhoto.css",
"~/Content/prettify.css",
"~/Content/flexslider.css",
"~/Content/iview.css",
"~/Content/style.css",
"~/Content/default.css"
));
bundles.Add(new StyleBundle("~/AppContent").Include(
"~/Content/bootstrap-tablesorter.css",
"~/Content/animate.css",
"~/Content/font-awesome.css",
"~/Content/jcarousel.css",
"~/Conten/overwrite.css",
"~/Content/sequence.css",
"~/Content/sequence.ie.css",
//more styles
));
bundles.Add(new ScriptBundle("~/TemplateScripts").Include(
"~/Scripts/modernizr-*",
"~/Scripts/jquery.js",
"~/Scripts/raphael.js",
"~/Scripts/jquery.easing.1.3.js",
"~/Scripts/bootstrap.js",
"~/Scripts/google-code-prettify/prettify.js",
"~/Scripts/jquery.elastislide.js",
"~/Scripts/jquery.tweet.js",
"~/Scripts/jquery.prettyPhoto.js",
"~/Scripts/jquery.flexslider.js",
"~/Scripts/iview.js",
"~/Scripts/jquery-hover-effect.js",
"~/Scripts/animate.js",
"~/Scripts/custom.js"
));
bundles.Add(new ScriptBundle("~/AppScripts").Include(
"~/Scripts/jquery.ticker.js",
"~/Scripts/jquery.contenthover.js",
"~/Scripts/jquery-ui-1.10.3.js",
"~/Scripts/datetimepicker.js",
"~/Scripts/jquery.metadata.js",
//more scripts
));
BundleTable.EnableOptimizations = true;
}
当我将应用程序发布到服务器(godaddy 共享虚拟主机)时,就会出现问题,我确实得到了缩小的输出,但我在这些输出上收到 403 错误。
如果我设置
BundleTable.EnableOptimizations = false;
文件未缩小,但页面具有正确的行为。
原来是 ASP.NET 表单身份验证。因此,捆绑包的名称不应是现有目录。好吧,表单身份验证拒绝访问那些不允许在 web.config 中的目录。
我不知道捆绑包创建了自己的目录,所以我基本上为这些目录添加了位置标签(即使它们不在解决方案中)。
所以基本上...
对于之前的所有捆绑包名称,我添加了"~/bundles/",然后在 web.config 中创建了以下位置标记:
<location path="bundles">
<system.web>
<authorization>
<allow users="*"/>
</authorization>
</system.web>
</location>
只要你不尝试捆绑缩小的脚本,它应该可以工作。有时,如果您编写了 javascript 并且错过了分号,这可能会导致脚本在调用它们时失败,但不会引发 403 错误。
由于您收到 403 错误,我猜这与捆绑无关。你能显示确切的错误吗?是 403.2:禁止读取访问吗?还是当您尝试发布到您的网站时(403.3:禁止写入访问)?开发时的最佳设置是正确设置本地 IIS,以便可以捆绑发布并发布到本地计算机。如果这有效,那么您需要做的就是将文件从本地计算机复制到公共服务器。如果公共服务器上出现问题,那么您就知道这是该计算机上的配置错误,而不是代码问题。
我最好的猜测是不允许将应用程序发布到站点(某些文件夹的写入访问权限被拒绝),但是如果没有进一步的信息,很难说。
编辑:在阅读了更多关于捆绑的信息后,我几乎可以肯定您正在将脚本捆绑到现有文件夹。
ASP.NET 中的每个请求都通过 http 处理程序(例如,静态处理程序、页面处理程序、ashx 处理程序等)进行管理。有一个名为 UrlRoutingModule 的特殊 HTTP 模块,它匹配 global.asax 中的路由。如果路由匹配,那么它将使用 HttpContext.RemapHandler 方法更改当前的 http 处理程序,否则正常的 ASP.NET 流将继续。类似地,System.Web.Optimization 插入一个 BundleModule http 模块,该模块尝试匹配绑定。如果找到匹配项,它将使用 HttpContext.RemapHandler 方法选择 BundleHandler 作为 http 处理程序。在内部,如果 HostingEnvironment.VirtualPathProvider.FileExists(path) 为 true 或 HostingEnvironment.VirtualPathProvider.DirectoryExists(path) 为 true,则 System.Web.Optimization 将留下匹配项。
阅读整个线程
话虽如此,使所有捆绑包都以"~/捆绑包/"开头。这将确保脚本不会指向存在的文件夹或被路由配置捕获。
bundles.Add(new ScriptBundle("~/bundles/jquery").Include(...
我的脚本包由于捆绑包名称中的点而失败,这解释了为什么它在调试中工作(因为那里没有真正的捆绑)并且在发布时失败。
之前(失败)
bundles.Add(new ScriptBundle("~/bundles/My.Corp.Scripts").Include(...
之后(固定)
bundles.Add(new ScriptBundle("~/bundles/MyCorpScripts").Include(...
不要忘记更新您的 razor 引用以使用固定的捆绑包名称