Kami menggunakan MVC Bundling di situs kami, CssRewriteUrlTransform
memastikan bahwa url gambar kerja dari dynamic bundel file css.
Tapi ini hanya bekerja ketika tidak menggunakan direktori virtual, saya.e
http://localhost/VirttualDir
tidak bekerja, namun http://localhost/
tidak. Hal ini karena CssRewriteUrlTransform
transform tidak mengambil virtual folder ke account user ketika menulis ulang url. Jadi, jika sebuah gambar real path localhost/vdir/konten/img/foo.png
ini akan menulis ulang ke localhost/konten/img/foo.png
yang salah
Saya tidak yakin sepenuhnya memahami masalah anda, tapi melihat http://localhost
di sini tampaknya salah. Anda tidak harus menggunakan URL absolut untuk bundel anda.
Bagi saya CssRewriteUrlTransform bekerja dengan sempurna, berikut adalah cara yang saya gunakan ini:
bundles.Add(new StyleBundle("~/bundles/css").Include(
"~/Content/css/*.css", new CssRewriteUrlTransform()));
"Bundel" adalah virtual.
Apakah ini bisa membantu?
Saya bingung dengan "VirtualDir" hal, karena anda berbicara tentang IIS VirtualDir, dan aku berpikir Bundel VirtualDir! It's benar bahwa dalam hal ini CssRewriteUrlTransform akan menulis ulang Url untuk Tuan rumah, bukan untuk Host/VirtualDir URI.
Untuk melakukan itu, anda harus memperoleh CssRewriteUrlTransform untuk membuatnya melakukan apa yang anda butuhkan untuk. Ada diskusi yang baik berikut ini: https://stackoverflow.com/questions/12577108/asp-net-mvc4-bundling-with-twitter-bootstrap?rq=1
Tampaknya jawaban terbaik adalah ada: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);
}
}
Menggunakan kelas ini bukan CssRewriteUrlTransform
Aku punya masalah yang sama. Ini adalah bagaimana saya tetap itu:
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) + ")");
}
}
Aku tahu itu's jauh dari sempurna, dan ada banyak dari edge kasus-kasus di mana hal ini bisa salah (saya'm tidak yakin anda dapat mengurai file CSS dengan regex di tempat pertama - meskipun ini adalah persis apa yang asli CssRewriteUrlTransform
tidak), tapi sejauh ini memegang...
The 'CssRewriteUrlTransform' bekerja dengan baik untuk aplikasi yang DOESN'T berjalan di atas virtual directory.
Jadi, jika aplikasi anda berjalan pada http://your-site.com/ berjalan baik-baik saja, tetapi jika berjalan pada http://your-site.com/your-app/ kau'll memiliki 404 untuk semua gambar anda, karena default 'CssFixRewriteUrlTransform' adalah referensi gambar anda dengan '/'.
Gunakan ini:
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));
}
}
Catatan: hapus semua file css dengan .min.css, karena jika don't itu doesn't fix.
Saya memiliki masalah dengan url yang berisi "data" dan bahkan url batin satu sama lain, jadi aku harus kembali melakukan regex, ini adalah solusi saya:
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));
}
}
berdasarkan https://stackoverflow.com/questions/171480/regex-grabbing-values-between-quotation-marks/34198968#34198968