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
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
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.
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...
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
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