CssRewriteUrlTransform有或没有虚拟目录

And*_*ers 61 c# web-optimization asp.net-mvc-4 bundling-and-minification

我们在我们的站点中使用MVC Bundling,CssRewriteUrlTransform确保图像URL在动态bundle css文件中工作.

但这只适用于不使用虚拟目录的情况,即

http://localhost/VirttualDir不行,但http://localhost/确实如此.这是因为CssRewriteUrlTransform在重写URL时,转换不会考虑虚拟文件夹.因此,如果图像真实路径是localhost/vdir/content/img/foo.png它将重写它localhost/content/img/foo.png是错误的

Ber*_*rdG 93

我不确定完全理解你的问题,但看到http://localhost这里似乎错了.绝不应该为捆绑包使用绝对URL.

对我来说CssRewriteUrlTransform工作得很好,这是我如何使用它:

bundles.Add(new StyleBundle("~/bundles/css").Include(
                "~/Content/css/*.css", new CssRewriteUrlTransform()));
Run Code Online (Sandbox Code Playgroud)

"捆绑"是虚拟的.

这有帮助吗?

更新

我对"VirtualDir"的事情很困惑,因为你在谈论IIS VirtualDir,我在想Bundle VirtualDir!确实,在这种情况下,CssRewriteUrlTransform将重写URL到主机,而不是主机/ VirtualDir URI.

要做到这一点,你必须派生CssRewriteUrlTransform使它做你需要的.这里有一个很好的讨论:ASP.NET MVC4与Twitter Bootstrap捆绑

似乎最好的答案是:http://aspnetoptimization.codeplex.com/workitem/83

public class CssRewriteUrlTransformWrapper : IItemTransform
{
    public string Process(string includedVirtualPath, string input)
    {           
        return new CssRewriteUrlTransform().Process("~" + VirtualPathUtility.ToAbsolute(includedVirtualPath), input);           
    }
}
Run Code Online (Sandbox Code Playgroud)

使用此类而不是CssRewriteUrlTransform

  • 当您的应用程序未托管在服务器根目录但在虚拟目录中时,会出现此问题.比如`/ path/to/my/appRoot /`. (7认同)

Vil*_*lx- 5

我有同样的问题.这就是我修复它的方法:

private class ProperUrlRewrite : IItemTransform
{
    private static string RebaseUrlToAbsolute(string baseUrl, string url)
    {
        if (string.IsNullOrWhiteSpace(url) || string.IsNullOrWhiteSpace(baseUrl) || url.StartsWith("/", StringComparison.OrdinalIgnoreCase) || url.Contains(':'))
            return url;
        return VirtualPathUtility.Combine(baseUrl, url);
    }
    private static Regex UrlPattern = new Regex("url\\s*\\(['\"]?(?<url>[^)]+?)['\"]?\\)");
    public string Process(string includedVirtualPath, string input)
    {
        if (includedVirtualPath == null)
            throw new ArgumentNullException("includedVirtualPath");
        if (string.IsNullOrWhiteSpace(input))
            return input;

        string directory = VirtualPathUtility.GetDirectory(VirtualPathUtility.ToAbsolute(includedVirtualPath));
        if (!directory.EndsWith("/", StringComparison.OrdinalIgnoreCase))
            directory += "/";
        return UrlPattern.Replace(input, match => "url(" + ProperUrlRewrite.RebaseUrlToAbsolute(directory, match.Groups["url"].Value) + ")");
    }
}
Run Code Online (Sandbox Code Playgroud)

我知道它远非完美,并且有很多边缘情况可能会出错(我不确定你是否可以首先用正则表达式解析CSS文件 - 虽然这正是原作CssRewriteUrlTransform所做的),但是它坚持......


Pha*_*̀nh 5

'CssRewriteUrlTransform'适用于不在虚拟目录之上运行的应用程序.

所以,如果您的应用程序在http://your-site.com/上运行,它运行得很好,但是如果在http://your-site.com/your-app/上运行,您的所有图像都会有404,因为默认的'CssFixRewriteUrlTransform'用'/'引用你的图像.

用这个:

public class CssFixRewriteUrlTransform: IItemTransform {

    private static string ConvertUrlsToAbsolute(string baseUrl, string content) {
        if (string.IsNullOrWhiteSpace(content)) {
            return content;
        }
        var regex = new Regex("url\\(['\"]?(?<url>[^)]+?)['\"]?\\)");
        return regex.Replace(content, match = > string.Concat("url(", RebaseUrlToAbsolute(baseUrl, match.Groups["url"].Value), ")"));
    }

    public string Process(string includedVirtualPath, string input) {
        if (includedVirtualPath == null) {
            throw new ArgumentNullException("includedVirtualPath");
        }
        var directory = VirtualPathUtility.GetDirectory(includedVirtualPath);
        return ConvertUrlsToAbsolute(directory, input);
    }

    private static string RebaseUrlToAbsolute(string baseUrl, string url) {
        if (string.IsNullOrWhiteSpace(url) || string.IsNullOrWhiteSpace(baseUrl) || url.StartsWith("/", StringComparison.OrdinalIgnoreCase)) {
            return url;
        }
        if (!baseUrl.EndsWith("/", StringComparison.OrdinalIgnoreCase)) {
            baseUrl = string.Concat(baseUrl, "/");
        }
        return VirtualPathUtility.ToAbsolute(string.Concat(baseUrl, url));
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:使用.min.css删除所有文件css,因为如果不解决它.

  • 您需要考虑数据uri格式.忽略RebaseUrlToAbsolute函数中以"data:"开头的URL (3认同)