69

私たちのサイトでは MVC バンドルを使用しCssRewriteUrlTransformており、画像の URL が動的バンドル css ファイルから機能することを確認しています。

ただし、これは仮想ディレクトリを使用していない場合にのみ機能します。

http://localhost/VirttualDir動作しませんがhttp://localhost/動作します。これは、CssRewriteUrlTransform変換が URL を書き換える際に仮想フォルダーを考慮しないためです。したがって、画像の実際のパスが間違っている場合はlocalhost/vdir/content/img/foo.png、それを書き換えますlocalhost/content/img/foo.png

4

4 に答える 4

5

「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));
    }
}

注: .min.css を含むすべてのファイル css を削除します。削除しないと修正されません。

于 2015-04-20T07:42:58.383 に答える
0

「データ」を含むURLに問題があり、別の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));
    }
}

正規表現に基づく: 引用符の間の値を取得する

于 2016-08-10T15:03:58.697 に答える