Управление версиями файлов CSS с помощью строки запроса, как это делает Stackoverflow?

Если вы посмотрите на источник Stackoverflow.com, вы увидите ссылку на их файл css:

<link href="/Content/all.min.css?v=2383" rel="stylesheet" type="text/css" />

Как это сделать, чтобы они могли передать версию через строку запроса и получить правильный файл CSS?


person mmcdole    schedule 02.02.2009    source источник
comment
См. этот более ранний вопрос для объяснения: в ссылке Css?   -  person Paul Dixon    schedule 02.02.2009
comment
Так что же в этом случае? Динамически генерируется?   -  person mmcdole    schedule 02.02.2009
comment
Почти наверняка нет, как я описал в этом ответе   -  person Paul Dixon    schedule 02.02.2009


Ответы (4)


Эта статья (пример PHP/.htaccess) объясняет лежащую в его основе идею. По сути, вы можете добавить метку времени последнего изменения файла к имени файла, но по-прежнему использовать исходный файл. Таким образом, каждый раз, когда вы сохраняете новую версию файла CSS, имя файла будет меняться, что заставит браузер загрузить новую версию. Это будет работать для многих типов файлов, включая файлы CSS и JS. (Альтернативой использованию имени файла может быть использование строки запроса.)

Пример ASP.NET таков:

public static string GetBreaker(string fileName)
{
    string cacheBreaker = null;
    try
    {
        if (fileName.StartsWith("~"))
        {
            fileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, fileName.Remove(0));
        }
        cacheBreaker = File.GetLastWriteTime(fileName).ToFileTime().ToString();
    }
    catch { }

    return string.IsNullOrEmpty(cacheBreaker) ? string.Empty : string.Format("?cachebreaker={0}", cacheBreaker);
}

И вы вызываете этот метод в своей мастер-странице следующим образом:

<link href="<%= this.ResolveClientUrl("~/CSS/style.css") %><%=CacheBreaker.GetBreaker("~/CSS/style.css") %>"
            rel="stylesheet" type="text/css" />
person Davide Vosti    schedule 02.02.2009

Так что ваш браузер не кэширует файл css. И использование номера версии удобно, поскольку файл css мог меняться в каждой версии.

Это не способ вызвать правильный файл css. Файл всегда один и тот же, но номер версии заставляет ваш браузер думать иначе и загружать его снова.

person Ólafur Waage    schedule 02.02.2009
comment
Итак, когда файл копируется, это его физическое имя файла? все.мин.css?v=2383 ? Я понимаю, что он используется для предотвращения кэширования - person mmcdole; 02.02.2009
comment
Это не имеет ничего общего с файлом. Его просто добавили в код страницы. Имя файла по-прежнему all.min.css - person Ólafur Waage; 02.02.2009
comment
И это на самом деле не предотвращает кеширование, но каждый раз, когда номер меняется, страница загружается снова, потому что это новый URL-адрес. Однако старые URL-адреса остаются в кэше. - person Bombe; 02.02.2009
comment
Это правильный ответ. - person davidkonrad; 28.03.2014

Если вы хотите знать, как это делается, они кратко упомянули об этом в предыдущей записи в блоге: это делается автоматически в процессе их сборки. см. этот пост в блоге (3-й пункт).

К сожалению, подробностей нет, но, возможно, вы сможете получить больше информации, прокомментировав эту запись в блоге или связавшись с командой stackoverflow.

person M4N    schedule 02.02.2009

Было бы проще просто менять имя файла каждый раз при его изменении для достижения того же эффекта.

file001.css
file002.css

У меня есть ощущение, что сохранение имени файла таким же и добавление ?ver=1234 должно упростить управление исходным кодом.

person Kevin Newman    schedule 09.06.2009