CssRewriteUrlTransform z lub bez katalogu wirtualnego

Używamy wiązania MVC w naszej witrynie, CssRewriteUrlTransform upewnia się, że adresy URL obrazów działają z pliku css dynamic bundle.

Ale to działa tylko wtedy, gdy nie używasz wirtualnego katalogu, czyli

http://localhost/VirttualDir nie działa, ale http://localhost/ działa. Dzieje się tak dlatego, że tranform CssRewriteUrlTransform nie bierze pod uwagę Wirtualnego folderu podczas przepisywania adresu url. Więc jeśli prawdziwa ścieżka obrazu to localhost/vdir/content/img/foo.png, to zmieni ją na localhost/content/img/foo.png, co jest złe

Author: marc_s, 2013-11-04

4 answers

Nie jestem pewien, czy w pełni rozumiem twój problem, ale widzenie tutaj wydaje się złe. Nigdy nie powinieneś używać bezwzględnego adresu URL dla swoich pakietów.

Dla mnie CssRewriteUrlTransform działa idealnie, oto jak go używam:

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

"Wiązki" są wirtualne.

Czy to pomaga?

Update

Pomyliłem się z "VirtualDir", jak mówisz o IIS VirtualDir, i myślałem o pakiecie VirtualDir! To prawda, że w tym przypadku CssRewriteUrlTransform przepisze adresy URL do hosta, a nie do hosta/VirtualDir URI.

Aby to zrobić, musisz wyprowadzić CssRewriteUrlTransform, aby zrobił to, czego potrzebujesz. Tu jest dobra dyskusja: ASP.NET połączenie MVC4 z Twitterem bootstrap

Wydaje się, że najlepsza odpowiedź jest tam: 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);           
    }
}

Użyj tej klasy zamiast CssRewriteUrlTransform

 81
Author: BernardG,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:25:40

'CssRewriteUrlTransform' działa dobrze dla aplikacji, które nie działają na wirtualnym katalogu.

Więc, jeśli Twoja aplikacja działa na http://your-site.com / działa dobrze, ale jeśli działa na http://your-site.com/your-app/ będziesz miał 404 dla wszystkich obrazów, ponieważ domyślne 'CssFixRewriteUrlTransform' odnosi się do Twoich obrazów za pomocą'/'.

Użyj tego:

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

Uwaga: usuń wszystkie pliki css z ./ min.css, bo jak nie to nie napraw.

 5
Author: Phan Đức Bình,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-15 10:47:29

Miałem ten sam problem. Tak to naprawiłem:

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

Wiem, że jest to dalekie od doskonałości i jest wiele przypadków krawędzi, w których może to pójść źle (nie jestem pewien, czy możesz parsować plik CSS z wyrażeniem regex w pierwszej kolejności - chociaż jest to dokładnie to, co robi oryginał CssRewriteUrlTransform), ale na razie trzyma...

 4
Author: Vilx-,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-04 10:16:37

Mam problemy z url, który zawiera "dane", a nawet URL wewnętrzny inny, więc muszę ponownie zrobić regex, to jest moje rozwiązanie:

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>(\\\1|.)*?)\1\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));
    }
}

Na podstawie RegEx: Przechwytywanie wartości między cudzysłowami

 -1
Author: Chrisdreams13,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:32:33