CssRewriteUrlTransform с виртуальным каталогом или без него



мы используем пакет MVC на нашем сайте,CssRewriteUrlTransform убедитесь, что URL-адреса изображений работают из файла CSS динамического пакета.



но это работает только тогда, когда не используется виртуальный каталог, т. е.



http://localhost/VirttualDir не работает, но http://localhost/ делает. Это потому что CssRewriteUrlTransform tranform не учитывает виртуальную папку при перезаписи url-адреса. Так что если изображение реальный путь localhost/vdir/content/img/foo.png он перепишет его на localhost/content/img/foo.png что неправильно

600   4  

4 ответов:

Я не уверен, что полностью понимаю вашу проблему, но, увидев http://localhost здесь кажется неправильным. Вы никогда не должны использовать абсолютный URL для ваших пакетов.

для меня CssRewriteUrlTransform работает отлично, вот как я его использую:

bundles.Add(new StyleBundle("~/bundles/css").Include(
                "~/Content/css/*.css", new CssRewriteUrlTransform()));

"связки" является виртуальным.

это помогает?

обновление

Я был смущен с" VirtualDir " вещь, как вы говорите о IIS VirtualDir, и я думал Bundle VirtualDir! Это правда что в этом случае CssRewriteUrlTransform будет переписывать URL-адреса на хост, а не на URI Host/VirtualDir.

чтобы сделать это, вы должны получить 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);           
    }
}

использовать этот класс вместо CssRewriteUrlTransform

'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));
    }
}

Примечание: удалить все файлы css С.минута.стиль CSS, потому что если этого не сделать, это не исправит.

у меня была та же проблема. Вот как я это исправил:

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) + ")");
    }
}

Я знаю, что это далеко не идеально, и есть много крайних случаев, когда это может пойти не так (я не уверен, что вы можете разобрать файл CSS с регулярным выражением в первую очередь - хотя это именно то, что оригинал CssRewriteUrlTransform делает), но пока он держится...

У меня проблемы с url-адресом, который содержит "данные" и даже url-адрес внутри другого, поэтому мне нужно повторно выполнить регулярное выражение, это мое решение:

public string Process(string includedVirtualPath, string input)
    {
        if (includedVirtualPath == null)
        {
            throw new ArgumentNullException(nameof(includedVirtualPath));
        }

        if (string.IsNullOrWhiteSpace(input))
        {
            return input;
        }

        var directory = VirtualPathUtility.GetDirectory(includedVirtualPath);
        if (!directory.EndsWith("/", StringComparison.OrdinalIgnoreCase))
        {
            directory += "/";
        }

        return new Regex(@"url\s*\(\s*([\'""]?)(?<scheme>(?:(?:data:)|(?:https?:))?)(?<url>(\|.)*?)\s*\)")
            .Replace(input, match => string.Concat(
                "url(",
                match.Groups[1].Value,
                match.Groups["scheme"].Value,
                match.Groups["scheme"].Value == "" ?
                    RebaseUrlToAbsolute(directory, match.Groups["url"].Value) :
                    match.Groups["url"].Value,
                match.Groups[1].Value,
                ")"
            ));
    }

    private static string RebaseUrlToAbsolute(string baseUrl, string url)
    {
        if (string.IsNullOrWhiteSpace(url) || string.IsNullOrWhiteSpace(baseUrl)
            || url.StartsWith("/", StringComparison.OrdinalIgnoreCase))
        {
            return url;
        }

        return VirtualPathUtility.ToAbsolute(string.Concat(baseUrl, url));
    }
}

на основе регулярное выражение: захват значений между кавычками

Comments

    Ничего не найдено.