CssRewriteUrlTransform с виртуальным каталогом или без него
мы используем пакет MVC на нашем сайте,CssRewriteUrlTransform убедитесь, что URL-адреса изображений работают из файла CSS динамического пакета.
но это работает только тогда, когда не используется виртуальный каталог, т. е.
http://localhost/VirttualDir не работает, но http://localhost/ делает. Это потому что CssRewriteUrlTransform tranform не учитывает виртуальную папку при перезаписи url-адреса. Так что если изображение реальный путь localhost/vdir/content/img/foo.png он перепишет его на localhost/content/img/foo.png что неправильно
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