Мы используем комплектации MVC в наш сайт, CssRewriteUrlTransform
гарантирует, что URL-адреса изображений работа с файлом динамической объединения CSS.
Но это работает только если вы не используете виртуальный каталог, я.е
http://localhost/VirttualDir
не работает, но http://localhost/делает. Это происходит потому, что
CssRewriteUrlTransformтрансформация не принимает виртуальную папку во внимание при перезаписи URL-адрес. Так что если изображения реальный путь являются
localhost/виртуальный_каталог/содержание/ИМГ/фу.ПНГ-это переписать его на localhost/содержание/ИМГ/фу.формат PNG`, что это неправильно
Я не уверен, что полностью понимаю вашу проблему, но видя http://localhost здесь кажется неправильным. Вы никогда не должны использовать абсолютный URL-адрес для вашей связки.
Для меня CssRewriteUrlTransform работает отлично, вот как я использую это:
bundles.Add(new StyleBundle("~/bundles/css").Include(
"~/Content/css/*.css", new CssRewriteUrlTransform()));
на "пачками" это виртуальный.
Это помогает?
Я был путать с "и VirtualDir" Ну что, как вы говорите о VirtualDir IIS, и я думал пачка VirtualDir! Это's садится, что в данном случае CssRewriteUrlTransform будет переписать URL-адреса в хост, не хост/VirtualDir Ури.
Чтобы сделать это, вы должны получить CssRewriteUrlTransform, чтобы сделать его делать то, что вам нужно. Хорошее обсуждение здесь: https://stackoverflow.com/questions/12577108/asp-net-mvc4-bundling-with-twitter-bootstrap?rq=1
Кажется, лучший ответ есть: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
У меня была та же проблема. Вот как я это исправил:
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-файл с regex в первую очередь - хотя это именно то, что в оригинальной CssRewriteUrlTransform
делает), но до сих пор она хранит...
В 'CssRewriteUrlTransform' работает просто отлично для приложений, которые не'Т работать поверх виртуального каталога.
Так, если ваше приложение работает на http://your-site.com/ она работает просто отлично, но если работает на http://your-site.com/your-app/ вы'll имеет 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, потому что, если Дон'т это вовсе'т исправить.
У меня проблемы с 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>(\\\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));
}
}