Вопрос или проблема
Я пытаюсь следовать этому руководству, в котором говорится, что я могу создать сервер, чтобы отправлять файл, например style.css, если запрашиваемый файл – style.15458888.css, с помощью правила переписывания, которое нужно поместить в файл htaccess.
Это правило
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+).(d+).(js|css)$ $1.$3 [L]
Так что я следовал этому в теге head
:
<?php $time = filemtime(get_template_directory() .'/assets/css/main.css');?>
<link href="https://wordpress.stackexchange.com/questions/280857/<?php echo get_template_directory_uri()."/assets/css/main.'.$time.'.css"?>" rel="stylesheet" type="text/css">
и это внутри Htaccess
:
# BEGIN WordPress
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpg "access plus 6 hours"
ExpiresByType image/jpeg "access plus 6 hours"
ExpiresByType image/gif "access plus 6 hours"
ExpiresByType image/png "access plus 6 hours"
ExpiresByType text/css "access plus 6 hours"
ExpiresByType application/pdf "access plus 1 week"
ExpiresByType text/javascript "access plus 6 hours"
ExpiresByType text/html "access plus 10 minutes"
ExpiresByType image/x-icon "access plus 1 year"
ExpiresDefault "access plus 3 hours"
</IfModule>
Header set X-Endurance-Cache-Level "2"
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
RewriteRule ^(.+).(d+).(js|css)$ $1.$3 [L]
</IfModule>
# END WordPress
Как видите, RewriteRule ^(.+).(d+).(js|css)$ $1.$3 [L]
было добавлено перед </IfModule>
И имя файла изменилось корректно, получив следующее:
<link href="http://ask.prosentra.com/wp-content/themes/tutorialblog/assets/css/main.1504604028.css" rel="stylesheet" type="text/css">
Но сервер все еще не реализует правило, о котором я упоминал. Что не так?
Это тупиковый подход, так как API очереди не поддерживает такой формат версионирования, что означает, что вам придется избегать его использования, что не очень хорошо. Ваша конкретная проблема здесь в том, что вы добавили правило слишком поздно, RewriteRule . /index.php [L]
“переводит” обработку на WordPress, и ничего после этого сделано не будет, что означает, что вам нужно поменять порядок правил. И снова, изменять правила переписывания ядра WordPress неумно, вам следует, вероятно, добавить конкретный раздел вне секции правил WordPress.
Вам нужно было просто добавить несколько \
и изменить порядок ваших правил, чтобы иметь это перед универсальным правилом (разместите ваше правило выше правила WordPress).
Вам нужен \
перед точками в этом случае, потому что вы хотите, чтобы оно соответствовало буквальным точкам в http-запросе.
Вам нужен \
перед d
, потому что мы хотим, чтобы оно соответствовало любой цифре, а не букве d.
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)\.(\d+)\.(js|css)$ $1.$3 [L]
С этим мы можем добавить любые произвольные цифры между точками в имени файла запроса, что сбросит кэш, но имя файла останется тем же на сервере.
Ответ или решение
Кэш-обменный механизм с помощью правил переписывания (Rewrite) в .htaccess
Кэширование является одним из ключевых аспектов оптимизации веб-сайтов, особенно в контексте работы с динамическими ресурсами, такими как стили CSS и скрипты JavaScript. В этой статье мы обсудим, как правильно настроить кэш-бустинг с использованием правил переписывания в файле .htaccess, обеспечивая более целенаправленный кэш на стороне клиента.
Задача
Ваша задача заключается в том, чтобы заставить сервер обрабатывать запросы к файлам с версионным обозначением, например: style.15458888.css
, и возвращать при этом актуальный файл style.css
.
Необходимые условия
Согласно вашему коду, вы используете WordPress, и ключевые моменты, которые следует учитывать:
- Правила переписывания должны быть правильно расположены в файле .htaccess. Порядок правил имеет решающее значение, так как более специфичные правила должны располагаться перед более общими.
- Экранирование символов: необходимо использовать обратные слэши (
\
), чтобы правильно интерпретировать знаки, такие как точки и буквы.
Правило переписывания
Правило, о котором идет речь, выглядит следующим образом:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)\.(\d+)\.(js|css)$ $1.$3 [L]
RewriteCond %{REQUEST_FILENAME} !-f
: Проверяет, что запрашиваемый файл не существует.RewriteRule ^(.+)\.(\d+)\.(js|css)$ $1.$3 [L]
: Изменяет запрос так, чтобы пользовательский запрос кfilename.123456.css
перенаправлялся наfilename.css
, игнорируя цифровую часть.
Расположение правил
Ваша задача – убедиться, что указанное правило находится выше общего правила WordPress. Правила WordPress могут перехватывать все входящие запросы, что не даст возможности достичь вашего специфичного правила кэширования.
Пример правильной структуры вашего файла .htaccess:
# BEGIN WordPress
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpg "access plus 6 hours"
ExpiresByType image/jpeg "access plus 6 hours"
ExpiresByType image/gif "access plus 6 hours"
ExpiresByType image/png "access plus 6 hours"
ExpiresByType text/css "access plus 6 hours"
ExpiresByType application/pdf "access plus 1 week"
ExpiresByType text/javascript "access plus 6 hours"
ExpiresByType text/html "access plus 10 minutes"
ExpiresByType image/x-icon "access plus 1 year"
ExpiresDefault "access plus 3 hours"
</IfModule>
Header set X-Endurance-Cache-Level "2"
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
# Ваше правило переписывания
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)\.(\d+)\.(js|css)$ $1.$3 [L]
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
Тестирование и Проверка
После внесения изменений следует провести тестирование. Откройте браузер и загрузите страницу с вашего сайта. Убедитесь, что при запросе style.15458888.css
на самом деле загружается файл style.css
. Для лучшей отладки можно использовать инструменты разработчика (F12) и проверить, какие именно файлы были загружены и какие запросы уходили к серверу.
Заключение
Правила переписывания в .htaccess могут стать мощным инструментом для управления кэшированием ваших файлов. Правильно настроив их, вы можете существенно улучшить производительность вашего веб-сайта. Помните, что порядок правил имеет критическое значение, а также важно учитывать все нюансы синтаксиса. Надеюсь, эти рекомендации помогут вам достичь желаемого результата.