Подавайте статические ресурсы с эффективной политикой кэширования – Google PageSpeed ​​Insights

Я использую OctoberCMS, у меня есть сервер apache и я использую AWS, и когда я провожу тестирование PageSpeed ​​https://developers.google.com/speed/pagespeed/insights/?url=https%3A%2F%2Fwww.rosterelf.com%2F&tab=desktop Я продолжаю получать сообщение об ошибке

Обслуживайте статические ресурсы с помощью эффективной политики кэширования

Вот мой код файла .htaccess для противодействия этой ошибке.

.htaccess

<IfModule mod_rewrite.c>

    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    <IfModule mod_headers.c>
        <If "%{REQUEST_SCHEME} == 'https' || %{HTTP:X-Forwarded-Proto} == 'https'">            
            Header always set Strict-Transport-Security "max-age=31536000"
        </If>
    </IfModule>

 

    ### MY OTHER DEFAULT CODE OF OCTOBERCMS WHICH IS NOT RELATED TO COMPRESSION ETC ... 

</IfModule>


# TN START GZIP COMPRESSION
<IfModule mod_gzip.c>
mod_gzip_on Yes
mod_gzip_dechunk Yes
mod_gzip_item_include file \.(html?|txt|css|js|php|pl)$
mod_gzip_item_include handler ^cgi-script$
mod_gzip_item_include mime ^text/.*
mod_gzip_item_include mime ^application/x-javascript.*
mod_gzip_item_exclude mime ^image/.*
mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*
</IfModule>
# TN END GZIP COMPRESSION

# TN START DEFLATE COMPRESSION
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE "application/atom+xml" \
"application/javascript" \
"application/json" \
"application/ld+json" \
"application/manifest+json" \
"application/rdf+xml" \
"application/rss+xml" \
"application/schema+json" \
"application/vnd.geo+json" \
"application/vnd.ms-fontobject" \
"application/x-font" \
"application/x-font-opentype" \
"application/x-font-otf" \
"application/x-font-truetype" \
"application/x-font-ttf" \
"application/x-javascript" \
"application/x-web-app-manifest+json" \
"application/xhtml+xml" \
"application/xml" \
"font/eot" \
"font/otf" \
"font/ttf" \
"font/opentype" \
"image/bmp" \
"image/svg+xml" \
"image/vnd.microsoft.icon" \
"image/x-icon" \
"text/cache-manifest" \
"text/css" \
"text/html" \
"text/javascript" \
"text/plain" \
"text/vcard" \
"text/vnd.rim.location.xloc" \
"text/vtt" \
"text/x-component" \
"text/x-cross-domain-policy" \
"text/xml"
</IfModule>
# END DEFLATE COMPRESSION

# TN START ENABLE KEEP ALIVE
<ifModule mod_headers.c>
Header set Connection keep-alive

# WEEK
<FilesMatch "\.(jpg|jpeg|png|gif|swf)$">
    Header set Cache-Control "max-age=604800, public"
</FilesMatch>

# WEEK
<FilesMatch "\.(js|css|swf)$">
    Header set Cache-Control "max-age=604800"
</FilesMatch>

</ifModule>
# TN END ENABLE KEEP ALIVE

# TN - START EXPIRES CACHING #
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType text/css "access 1 month"
ExpiresByType text/javascript "access plus 1 month"
ExpiresByType text/html "access 1 month"
ExpiresByType image/gif "access 1 year"
ExpiresByType image/png "access 1 year"
ExpiresByType image/jpg "access 1 year"
ExpiresByType image/jpeg "access 1 year"
ExpiresByType image/webp "access plus 1 year"
ExpiresByType image/x-icon "access 1 year"
ExpiresByType image/svg+xml "access plus 1 month"
ExpiresByType image/svg "access 1 year"
ExpiresByType audio/ogg "access plus 1 year"
ExpiresByType video/mp4 "access plus 1 year"
ExpiresByType video/mpeg "access plus 1 year"
ExpiresByType video/ogg "access plus 1 year"
ExpiresByType video/webm "access plus 1 year"
ExpiresByType application/atom+xml "access plus 1 hour"
ExpiresByType application/rss+xml "access plus 1 hour"
ExpiresByType application/pdf "access 1 month"
ExpiresByType application/javascript "access 1 month"
ExpiresByType text/x-javascript "access 1 month"
ExpiresByType application/xhtml-xml "access 1 month"
ExpiresByType text/x-component "access plus 1 month"
ExpiresByType application/x-shockwave-flash "access 1 month"
ExpiresByType font/opentype "access plus 1 month"
ExpiresByType application/vnd.ms-fontobject "access plus 1 month"
ExpiresByType application/x-font-ttf "access plus 1 month"
ExpiresByType application/font-woff "access plus 1 month"
ExpiresByType application/font-woff2 "access plus 1 month"
ExpiresByType image/vnd.microsoft.icon "access plus 1 year"

# Fonts
ExpiresByType font/ttf "access plus 1 year"
ExpiresByType font/otf "access plus 1 year"
ExpiresByType font/woff "access plus 1 year"
ExpiresByType font/woff2 "access plus 1 year"
ExpiresByType application/font-woff "access plus 1 year"

ExpiresDefault "access 1 month"
</IfModule>
# TN - END EXPIRES CACHING #

Но все же эта ошибка сохраняется с 77 ресурсами.

Я пробовал много вещей, как вы можете видеть, добавляя так много кода, но количество ошибок не уменьшается, и он также продолжает получать файлы .js, .png, .css.

Может ли кто-нибудь указать мне, что мне не хватает здесь в моем коде.

Спасибо


Обновлен ФАЙЛ HTACCESS

<IfModule mod_rewrite.c>

    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    <IfModule mod_headers.c>
        <If "%{REQUEST_SCHEME} == 'https' || %{HTTP:X-Forwarded-Proto} == 'https'">            
            Header always set Strict-Transport-Security "max-age=31536000"
        </If>
    </IfModule>

    RewriteEngine On

    ##
    ## You may need to uncomment the following line for some hosting environments,
    ## if you have installed to a subdirectory, enter the name here also.
    ##
    # RewriteBase /   


</IfModule>


# TN START GZIP COMPRESSION
<IfModule mod_gzip.c>
mod_gzip_on Yes
mod_gzip_dechunk Yes
mod_gzip_item_include file \.(html?|txt|css|js|php|pl)$
mod_gzip_item_include handler ^cgi-script$
mod_gzip_item_include mime ^text/.*
mod_gzip_item_include mime ^application/x-javascript.*
mod_gzip_item_exclude mime ^image/.*
mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*
</IfModule>
# TN END GZIP COMPRESSION

# TN START DEFLATE COMPRESSION
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE "application/atom+xml" \
"application/javascript" \
"application/json" \
"application/ld+json" \
"application/manifest+json" \
"application/rdf+xml" \
"application/rss+xml" \
"application/schema+json" \
"application/vnd.geo+json" \
"application/vnd.ms-fontobject" \
"application/x-font" \
"application/x-font-opentype" \
"application/x-font-otf" \
"application/x-font-truetype" \
"application/x-font-ttf" \
"application/x-javascript" \
"application/x-web-app-manifest+json" \
"application/xhtml+xml" \
"application/xml" \
"font/eot" \
"font/otf" \
"font/ttf" \
"font/opentype" \
"image/bmp" \
"image/svg+xml" \
"image/vnd.microsoft.icon" \
"image/x-icon" \
"text/cache-manifest" \
"text/css" \
"text/html" \
"text/javascript" \
"text/plain" \
"text/vcard" \
"text/vnd.rim.location.xloc" \
"text/vtt" \
"text/x-component" \
"text/x-cross-domain-policy" \
"text/xml"
</IfModule>
# END DEFLATE COMPRESSION

# TN START ENABLE KEEP ALIVE
<IfModule mod_headers.c>
    Header set Connection keep-alive

</IfModule>
# TN END ENABLE KEEP ALIVE

# TN - START EXPIRES CACHING #
<IfModule mod_expires.c>
ExpiresActive On

ExpiresDefault "access plus 1 month"

ExpiresByType text/css "access plus 1 month"
ExpiresByType text/javascript "access plus 1 month"
ExpiresByType text/html "access plus 1 month"
ExpiresByType image/gif "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
ExpiresByType image/jpg "access plus 1 year"
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/webp "access plus 1 year"
ExpiresByType image/x-icon "access plus 1 year"
ExpiresByType image/svg+xml "access plus 1 month"
ExpiresByType image/svg "access plus 1 year"
ExpiresByType audio/ogg "access plus 1 year"
ExpiresByType video/mp4 "access plus 1 year"
ExpiresByType video/mpeg "access plus 1 year"
ExpiresByType video/ogg "access plus 1 year"
ExpiresByType video/webm "access plus 1 year"
ExpiresByType application/atom+xml "access plus 1 hour"
ExpiresByType application/rss+xml "access plus 1 hour"
ExpiresByType application/pdf "access plus 1 month"
ExpiresByType application/javascript "access plus 1 month"
ExpiresByType text/x-javascript "access plus 1 month"
ExpiresByType application/xhtml-xml "access plus 1 month"
ExpiresByType text/x-component "access plus 1 month"
ExpiresByType application/x-shockwave-flash "access plus 1 month"
ExpiresByType font/opentype "access plus 1 month"
ExpiresByType application/vnd.ms-fontobject "access plus 1 month"
ExpiresByType application/x-font-ttf "access plus 1 month"
ExpiresByType application/font-woff "access plus 1 month"
ExpiresByType application/font-woff2 "access plus 1 month"
ExpiresByType image/vnd.microsoft.icon "access plus 1 year"

# Fonts
ExpiresByType font/ttf "access plus 1 year"
ExpiresByType font/otf "access plus 1 year"
ExpiresByType font/woff "access plus 1 year"
ExpiresByType font/woff2 "access plus 1 year"
ExpiresByType application/font-woff "access plus 1 year"

  <IfModule mod_headers.c>
          Header append Cache-Control "public"
  </IfModule>


</IfModule>


<IfModule mod_headers.c>
  Header unset ETag
</IfModule>
FileETag None

<IfModule mod_headers.c>
  Header unset Last-Modified
</IfModule>

# TN - END EXPIRES CACHING #

person Mittul At TechnoBrave    schedule 30.04.2021    source источник
comment
Только длина кеша — они ожидают минимум 6 месяцев и в идеале 1 год для всех статических ресурсов. Так что просто увеличьте время кэширования для них (CSS, JS, SVG кажутся единственными, о которых стоит беспокоиться) и используйте методы очистки кэша, если они изменятся. Я не вижу ничего другого из данного файла.   -  person Graham Ritchie    schedule 30.04.2021
comment
@GrahamRitchie Спасибо за ваш ответ и отзыв. Итак, мне нужно изменить все, чтобы установить 1 месяц?   -  person Mittul At TechnoBrave    schedule 30.04.2021
comment
Измените все 1 месяц как минимум на 6 месяцев или, предпочтительно, на год. Но это только для статических ресурсов (поэтому HTML может быть короче, rss может быть короче и т. д.). Думайте о статических активах как о чем-то, что находится в файловой системе, а не генерируется с помощью кода — все они должны иметь кеши на 1 год.   -  person Graham Ritchie    schedule 30.04.2021
comment
У вас также есть несколько дубликатов - например. <FilesMatch "\.(js|css|swf)$">, поэтому вы можете удалить это, поскольку вы устанавливаете их все ниже, поэтому их следует переопределить.   -  person Graham Ritchie    schedule 30.04.2021
comment
хм, судя по ответу вашего сайта, ваши изображения не имеют кэша, убедитесь, что ваш mod_headers включен   -  person Hardik Satasiya    schedule 30.04.2021
comment
@GrahamRitchie Я удалил дубликаты, как вы упомянули ... не могли бы вы указать, какой из элементов из списка я должен установить как 1 год?   -  person Mittul At TechnoBrave    schedule 30.04.2021
comment
@GrahamRitchie Также можете ли вы предложить что-нибудь еще, почему я продолжаю получать около 77 файлов с изображениями, png и т. Д. Я уже поместил вызов в свой файл htaccess.   -  person Mittul At TechnoBrave    schedule 30.04.2021
comment
что бы вы ни сделали, это не совсем правильно. Проверяя заголовки, срок действия истекает до 1 месяца. Удалите часть <FilesMatch "\.(js|css|swf)$">, она явно имеет приоритет,   -  person Graham Ritchie    schedule 30.04.2021
comment
Я удалил файлы, соответствующие .. нужно ли мне делать что-то еще, кроме истечения срока действия?   -  person Mittul At TechnoBrave    schedule 30.04.2021
comment
@HardikSatasiya Спасибо, братан, за твой вклад. Я проверил, и mod_headers уже включен, поскольку я использую сервер AWS. Что еще я могу сделать, чтобы удалить ошибки, связанные с изображениями png, и другие проблемы, связанные с той же ошибкой? Не могли бы вы направить меня?   -  person Mittul At TechnoBrave    schedule 03.05.2021


Ответы (1)


Но все же эта ошибка сохраняется с 77 ресурсами.

Имейте в виду, что некоторые из этих ресурсов находятся во внешних доменах, которые вы не контролируете.

Как указано в связанном документе из результатов PageSpeed:

По возможности кэшируйте неизменяемые статические ресурсы на длительный срок, например год или дольше.

Для одного из ваших .jpg ресурсов .../images/rosterelftechsupport.jpg, который, по данным Google PageSpeed ​​Insights, кэшировался в течение 30 дней, имеет следующие заголовки ответа HTTP:

cache-control: max-age=2592000, public
expires: Thu, 12 May 2022 16:05:33 GMT

В то время как заголовок expires указывает время кэширования 1 год, директива max-age заголовка cache-control указывает 30 дней (2 592 000 секунд). Все современные браузеры будут отдавать приоритет заголовку cache-control: max-age, поэтому время кэширования составляет 30 дней.

ExpiresByType image/jpeg "access 1 year"

Эта директива mod_expires устанавливает заголовки expires и cache-control: max-age для файлов .jpg (MIME-тип: image/jpeg). Таким образом, это, кажется, соблюдается, поскольку заголовок expires установлен правильно, и вы явно не устанавливаете это где-либо еще.

<FilesMatch "\.(jpg|jpeg|png|gif|swf)$">
    Header set Cache-Control "max-age=604800, public"
</FilesMatch>

Однако любая директива Header set Cache-Control (mod_headers), такая как эта, переопределит заголовок Cache-Control, установленный mod_expires, и повлияет на время кэширования. Итак, может показаться, что у вас все еще может быть мошенническая директива Header?

Оба вам точно не нужны. Если вы используете mod_expires, используйте только mod_expires. Для этого вам не нужны mod_headers. Другими словами, вы должны удалить все блоки <FilesMatch ...> Header set Cache-Control ... </FilesMatch> (такие как выше), так как они напрямую конфликтуют с директивами mod_expires (т.е. ExpiresByType).

Единственная причина использовать директиву mod_headers Header set Cache-Control ... — это если mod_expires не был доступен на вашем сервере. Единственная причина использовать здесь и mod_expires, и mod_headers — это если вы устанавливаете приложение на несколько серверов и предполагается, что mod_expires установлен не на всех серверах (маловероятно). В этом случае директивы mod_headers должны быть заключены в контейнер <IfModule !mod_expires.c> (т. е. если mod_expires недоступен), в противном случае mod_headers всегда будет иметь приоритет (как упоминалось выше).

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


ОБНОВЛЕНИЕ:

Я удалил FilesMatch из файла, а также проверил в своем приватном окне браузера и открыл веб-сайт, а затем запустил Pagespeed Insights.. но он все еще показывает около 56 ресурсов, не кэшированных, включая изображения png и т. д.

Все изображения .jpg и .png, отображаемые из вашего домена, больше не представлены в этом отчете, поэтому они, похоже, разрешены.

Остальные 8 изображений .png, которые все еще отображаются в отчете и не имеют заголовков Cache-Control или Expires, обслуживаются непосредственно из s3-ap-southeast-2.amazonaws.com, на что ваши директивы не обязательно повлияют. Возможно, вам нужно проверить настройки корзины S3?

...config/176…?v=2.9.39&r=stable(connect.facebook.net)        20m

У вас есть 7 ресурсов, обслуживаемых внешними третьими сторонами (например, этот), которые вы не контролируете.

...industries/nonprofit.svg(www.rosterelf.com)                30 d

ExpiresByType image/svg+xml "access plus 1 month"

У вас есть 22 .svg изображения из вашего домена. Все они обслуживаются с типом контента image/svg+xml. Как видно из приведенной выше директивы ExpiresByType, они настроены на кэширование только в течение 1 месяца (т.е. 30 дней). Если вы хотите, чтобы они кэшировались на более длительный период, измените указанную выше директиву, как вы уже сделали для файлов JPEG и PNG.

...js/swiper-bundle.min.js(www.rosterelf.com)                 30 d

ExpiresByType application/javascript "access plus 1 month"

У вас есть 11 файлов .js, которые обслуживаются из вашего домена, и все они обслуживаются с типом контента application/javascript. Измените указанную выше директиву ExpiresByType соответствующим образом, если вы хотите, чтобы эти файлы кэшировались дольше.

ОДНАКО, вы должны отметить, что отчет Google PageSpeed ​​является только предложением. Изменяйте эту (и другие директивы кэширования) только в том случае, если это имеет смысл для вашей системы. У вас возникнут проблемы, если эти файлы необходимо изменить до истечения срока действия кеша, если вы не применили какой-либо другой метод очистки кеша.

Это также означает, что следующие директивы совершенно излишни и могут быть удалены:

ExpiresByType text/javascript "access plus 1 month"
ExpiresByType text/x-javascript "access plus 1 month"

Ваш сервер отправляет .js ответов с правильным application/javascript MIME-типом, поэтому установка директив кэширования для text/javascript и text/x-javascript также не требуется.

...css/custom.min.css(www.rosterelf.com)                     30 d

ExpiresByType text/css "access plus 1 month"

У вас есть 6 файлов .css, которые обслуживаются вашим доменом. То же самое относится и к файлам .js.

... fonts/social-media-icon.ttf?lvmhu5(www.rosterelf.com)    30 d

У вас есть 6 файлов .ttf (шрифтов). Да, их, безусловно, следует кэшировать на более длительный период. Все они обслуживаются с типом application/font-sfnt*1 mime/content. Однако у вас нет явной директивы, которая охватывает это, поэтому по умолчанию будет ExpiresDefault (т.е. 1 месяц). Вам нужно добавить соответствующую директиву для этого MIME-типа. Например:

ExpiresByType application/font-sfnt "access plus 1 year"

(*1 application/font-sfnt фактически устарел в пользу font/sfnt.)

Это может означать, что все следующие директивы (кеширование шрифтов) излишни, если вы не обслуживаете эти типы файлов?

ExpiresByType font/opentype "access plus 1 month"
ExpiresByType application/vnd.ms-fontobject "access plus 1 month"
ExpiresByType application/x-font-ttf "access plus 1 month"
ExpiresByType application/font-woff "access plus 1 month"
ExpiresByType application/font-woff2 "access plus 1 month"
ExpiresByType image/vnd.microsoft.icon "access plus 1 year"

# Fonts
ExpiresByType font/ttf "access plus 1 year"
ExpiresByType font/otf "access plus 1 year"
ExpiresByType font/woff "access plus 1 year"
ExpiresByType font/woff2 "access plus 1 year"
ExpiresByType application/font-woff "access plus 1 year"

И чтобы подчеркнуть мой комментарий выше... результаты отчета Google PageSpeed ​​(и любого другого отчета SEO) носят только рекомендательный характер... возможное предложение. Не обязательно неправильно обслуживать ресурсы с более коротким временем кэширования. Этим советам не следует слепо следовать. Не применяйте длительное время кэширования, чтобы просто удовлетворить отчет. Только если это имеет смысл для вашего приложения, следует кэшировать эти ресурсы на более длительные периоды времени.

person MrWhite    schedule 13.05.2021
comment
Спасибо за ваш ответ.. значит, вы считаете, что я должен удалить <FilesMatch "\.(jpg|jpeg|png|gif|swf)$"> из своего кода? Не могли бы вы помочь мне .. Я совершенно ничего не понимаю в этом. Спасибо - person Mittul At TechnoBrave; 13.05.2021
comment
@MittulAtTechnoBrave Да, вы должны удалить все блоки <FilesMatch ...> Header set Cache-Control ... </FilesMatch>, поскольку они напрямую конфликтуют с директивами mod_expires (т.е. ExpiresByType). Я обновил свой ответ, чтобы прояснить это. - person MrWhite; 14.05.2021
comment
Я удалил FilesMatch из файла, а также проверил в своем приватном окне своего браузера и открыл веб-сайт, а затем запустил Pagespeed Insights ... но он все еще показывает около 56 ресурсов, не кэшированных, включая изображения png и т. д. - person Mittul At TechnoBrave; 17.05.2021
comment
Я также обновил файл .htaccess в своем вопросе, чтобы вы могли лучше узнать, что находится внутри файла. - person Mittul At TechnoBrave; 17.05.2021
comment
Я также удалил часть Header unset ETag, часть Header unset Last-Modified из файла htaccess, но он все еще показывает те же ошибки кэширования. - person Mittul At TechnoBrave; 17.05.2021
comment
@MittulAtTechnoBrave, но он по-прежнему показывает около 56 ресурсов, не кэшированных, включая изображения png и т. Д. - эти оставшиеся изображения PNG находятся в другом домене и могут быть вне вашего контроля (или настраиваются из вашей корзины S3?). Я обновил свой ответ, чтобы рассмотреть этот и другие типы файлов, фигурирующие в этом отчете. - person MrWhite; 17.05.2021
comment
Спасибо за отзыв. Я удалил ExpiresByType text/javascript "access plus 1 month", ExpiresByType text/x-javascript "access plus 1 month", ExpiresByType text/css "access plus 1 month" и добавил ExpiresByType application/font-sfnt "access plus 1 year" в соответствии с вашим отзывом и предложением. Вроде количество уменьшилось. Но у меня все еще есть ошибки изображений png и svg, которые я контролирую. Не подскажете, в чем теперь причина? Спасибо - person Mittul At TechnoBrave; 18.05.2021
comment
@MittulAtTechnoBrave Я не говорил удалять ExpiresByType text/css "access plus 1 month" - его необходимо обновить (например, файлы JS), если вы хотите увеличить время кэширования файлов CSS (но обратите внимание на упомянутые предостережения). Перечисленные изображения PNG не относятся к вашему домену? И я уже рассмотрел изображения SVG в своем ответе выше. - person MrWhite; 18.05.2021
comment
Меня устраивает время кэширования в 1 месяц для файлов css и js. Да, несколько файлов PNG обслуживаются из корзины S3. что я должен сделать для них? - person Mittul At TechnoBrave; 19.05.2021