«CssRewriteUrlTransform» прекрасно работает для приложений, которые не запускается поверх виртуального каталога.
Так что, если ваше приложение работает на http://your-site.com/ он работает просто отлично, но если работает на http://your-site.com/your-app/ вы будете иметь 404 для всех ваших изображений, так как «CssFixRewriteUrlTransform» по умолчанию ссылаются изображения с «/».
Чтобы решить эту проблему, я реализовали свою собственную версию 'CssRewriteUrlTransform', как это:
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));
}
}
UPDATE: благодаря superjos, который указал, что было еще одно решение там:
public class CssRewriteUrlTransformWrapper : IItemTransform
{
public string Process(string includedVirtualPath, string input)
{
return new CssRewriteUrlTransform().Process("~" + VirtualPathUtility.ToAbsolute(includedVirtualPath), input);
}
}
отлично, отлично работал, спасибо! – Pelle
hao-kung, это, похоже, не работает для меня с правилами 'font-face'. Должно ли это? – flipdoubt
@flipdoubt вы можете опубликовать пример/воспроизвести с тем, что не работает? –