Заставить браузер получать последнюю версию определенных источников (CSS, JS и т. Д.)

Когда кто-то посещает мой веб-сайт, я хотел бы убедиться, что в браузере установлена ​​последняя версия моих файлов CSS, JS и т. Д. Идея, с которой я пришел, состоит в том, чтобы добавить дополнительную ссылку на мои ссылки:

Вместо того, чтобы использовать

<script type="text/javascript" src="www.mywebsite.com/my_file.js"><script>

я звоню

<script type="text/javascript" src="www.mywebsite.com/my_file.js?lastUpdate"><script>

И мне удается заменить lastUpdate датой последней модификации файла. Ссылка становится «новой», и браузер обновляет свой кеш, относящийся к файлу. Обратите внимание, что все мои файлы находятся на моем сервере.

Для этого я вызываю функцию php (вкратце)

function getLastUpdate($link){
    if(file_exists($link)){
        return $link.'?'.filetime($link);
    }
    return $link;
}

и назовите это:

echo '<script type="text/javascript" src="'.getLastUpdate('www.mywebsite.com/my_file.js').'"><script>';

Все работает. Почти. Функция хранится в ./code/function.php и используется многими файлами во многих разных папках. Моя проблема: я не знаю, что поставить для $ link. Что касается URL-адреса, иногда он работает, иногда нет. Если я укажу абсолютный путь к файлу (мне было бы проще), функция file_exists вернет false. Если я даю относительный путь, иногда это работает, иногда нет. Полагаю из-за того, что я использую переписывание URL, а ссылка меняется?

Что я делаю неправильно ? Как мне решить эту проблему? Спасибо !


person Fenix Aoras    schedule 11.07.2019    source источник
comment
Я объясняю здесь проблему, с которой я столкнулся, и как я пытаюсь ее решить. Я открыт для любого другого способа достичь этого ... Например, изменить заголовки моих файлов?   -  person Fenix Aoras    schedule 11.07.2019


Ответы (1)


Я использую такой код, чтобы всегда получать последнюю версию:

Функция:

function file_versioning($file){
    $filemtime = filemtime($file);
    return "{$file}?v={$filemtime}";
}

Вызов функции в "Core.php":

$CssLib = file_versioning("{$IncDir}/Lib.css");
// $IncDir is the relative path from the php script to the "library folder"
echo <<<EOD
    <link rel="stylesheet" type="text/css" href="{$CssLib}" />
EOD;

Вызов «Ядра» в «index.php»:

$IncDir ='.inc/Libs';
require $IncDir.'/Core.php';

⋅ ⋅ ⋅

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

person Takit Isy    schedule 11.07.2019
comment
Это похоже на мой код, мы придерживаемся той же идеи. Но что вы даете как $ file? абсолютное, относительное и т. д.? Эта функция вернет ошибку, если файл не найден. - person Fenix Aoras; 11.07.2019
comment
@FenixAoras Я работал над этим, но хотел опубликовать ответ до того, как ваша тема закроется. Я обновился! Подойдут ли вам такие вещи? - person Takit Isy; 11.07.2019
comment
Я попытался преобразовать все свои ссылки, чтобы они начинались с корня, например, вот так ›./code/script.js Однако filetime иногда выдает ошибку, которая не удалась для filelink ... - person Fenix Aoras; 11.07.2019
comment
@FenixAoras Может быть, поэтому я использовал относительные пути… :) (точно не помню, это было давно!) - person Takit Isy; 11.07.2019