Файл .htaccess

Главные вкладки

Аватар пользователя Anjela Anjela 30 января 2020 в 17:53

Добрый день
При проверке скорости загрузки сайта гугл выдает следующее -
Задайте правила эффективного использования кеша для статических объектов Найден 41 ресурс

Перегуглила и перепробовала массу вариантов - скорость загруски либо становится хуже, либо не меняется.
Как решить ПОМОГИТЕ!

Лучший ответ

Аватар пользователя bsyomov bsyomov 31 января 2020 в 23:01
# Enable expirations.
ExpiresActive On

# Cache all files for 2 weeks after access (A).
ExpiresDefault A1209600

Вот то, что вам нужно.
Можно заменить на:

ExpiresDefault "access plus 6 month"

что даст вам время устаревания кеша статики в пол года.

Комментарии

Аватар пользователя bsyomov bsyomov 31 января 2020 в 3:00

Меня позвали потому, что я разбераюсь в этом вопросе. Smile
Правда, чтобы вам помочь, надо либо знать ваш домен, либо посмотреть на скрин из PSI, чтобы понять, что именно у вас не кешируется.

Также, неплохо бы знать что-то о том, где хостится ваш сайт. Там статика может, например, отдаваться напрямую nginx, и тогда настойки её кеширования должны быть в конфиге nginx, а присловутый htaccess может действительно не иметь к этому отношения.

Аватар пользователя bsyomov bsyomov 31 января 2020 в 16:24

У вас на статику сейчас expires 14 дней, что по мнению PSI очень мало, но вообще, заголовки есть.
Что именно у вас сейчас прописано в .htaccess касаемо Expires?

Аватар пользователя Anjela Anjela 31 января 2020 в 18:32

Честно сказать я не знаю, что такое Expires
Если Вы не против, ниже весь файл .htaccess
# SpaceWeb
SetEnvIf X-Forwarded-Proto https SERVER_PORT=443
SetEnvIf X-Forwarded-Proto https HTTPS=on
# SpaceWeb

#
# Apache/PHP/Drupal settings:
#

# Protect files and directories from prying eyes.

Order allow,deny

# Don't show directory listings for URLs which map to a directory.
Options -Indexes

# Follow symbolic links in this directory.
Options +FollowSymLinks

# Make Drupal handle any 404 errors.
ErrorDocument 404 //index.php

# Set the default handler.
DirectoryIndex index.php index.html index.htm

# Override PHP settings that cannot be changed at runtime. See
# sites/default/default.settings.php and drupal_environment_initialize() in
# includes/bootstrap.inc for settings that can be changed at runtime.

# PHP 5, Apache 1 and 2.

php_flag magic_quotes_gpc off
php_flag magic_quotes_sybase off
php_flag register_globals off
php_flag session.auto_start off
php_value mbstring.http_input pass
php_value mbstring.http_output pass
php_flag mbstring.encoding_translation off

# Requires mod_expires to be enabled.

# Enable expirations.
ExpiresActive On

# Cache all files for 2 weeks after access (A).
ExpiresDefault A1209600

# Do not allow PHP scripts to be cached unless they explicitly send cache
# headers themselves. Otherwise all scripts would have to overwrite the
# headers set by mod_expires if they want another caching behavior. This may
# fail if an error occurs early in the bootstrap process, and it may cause
# problems if a non-Drupal PHP file is installed in a subdirectory.
ExpiresActive Off

# Various rewrite rules.

RewriteEngine on

# Set "protossl" to "s" if we were accessed via https://. This is used later
# if you enable "www." stripping or enforcement, in order to ensure that
# you don't bounce between http and https.
RewriteRule ^ - [E=protossl]
RewriteCond %{HTTPS} on
RewriteRule ^ - [E=protossl:s]

# Make sure Authorization HTTP header is available to PHP
# even when running as CGI or FastCGI.
RewriteRule ^ - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

# Block access to "hidden" directories whose names begin with a period. This
# includes directories used by version control systems such as Subversion or
# Git to store control files. Files whose names begin with a period, as well
# as the control files used by CVS, are protected by the FilesMatch directive
# above.
#
# NOTE: This only works when mod_rewrite is loaded. Without mod_rewrite, it is
# not possible to block access to entire directories from .htaccess, because
# is not allowed here.
#
# If you do not have mod_rewrite installed, you should remove these
# directories from your webroot or otherwise protect them from being
# downloaded.
RewriteRule "(^|/)\." - [F]

# If your site can be accessed both with and without the 'www.' prefix, you
# can use one of the following settings to redirect users to your preferred
# URL, either WITH or WITHOUT the 'www.' prefix. Choose ONLY one option:
#
# To redirect all users to access the site WITH the 'www.' prefix,
# (http://example.com/... will be redirected to http://www.example.com/...)
# uncomment the following:
# RewriteCond %{HTTP_HOST} .
# RewriteCond %{HTTP_HOST} !^www\. [NC]
# RewriteRule ^ http%{ENV:protossl}://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
#
Options +FollowSymLinks
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.dlyaturista.info$ [NC]
RewriteRule ^(.*)$ https://dlyaturista.info/$1 [R=301,L]

# Modify the RewriteBase if you are using Drupal in a subdirectory or in a
# VirtualDocumentRoot and the rewrite rules are not working properly.
# For example if your site is at http://example.com/drupal uncomment and
# modify the following line:
RewriteBase /
#
# If your site is running in a VirtualDocumentRoot at http://example.com/,
# uncomment the following line:
# RewriteBase /

# Pass all requests not referring directly to files in the filesystem to
# index.php. Clean URLs are handled in drupal_environment_initialize().
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !=/favicon.ico
RewriteRule ^ index.php [L]

# Rules to correctly serve gzip compressed CSS and JS files.
# Requires both mod_rewrite and mod_headers to be enabled.

# Serve gzip compressed CSS files if they exist and the client accepts gzip.
RewriteCond %{HTTP:Accept-encoding} gzip
RewriteCond %{REQUEST_FILENAME}\.gz -s
RewriteRule ^(.*)\.css $1\.css\.gz [QSA]

# Serve gzip compressed JS files if they exist and the client accepts gzip.
RewriteCond %{HTTP:Accept-encoding} gzip
RewriteCond %{REQUEST_FILENAME}\.gz -s
RewriteRule ^(.*)\.js $1\.js\.gz [QSA]

# Serve correct content types, and prevent mod_deflate double gzip.
RewriteRule \.css\.gz$ - [T=text/css,E=no-gzip:1]
RewriteRule \.js\.gz$ - [T=text/javascript,E=no-gzip:1]

# Serve correct encoding type.
Header set Content-Encoding gzip
# Force proxies to cache gzipped & non-gzipped css/js files separately.
Header append Vary Accept-Encoding

Аватар пользователя bsyomov bsyomov 31 января 2020 в 23:01
# Enable expirations.
ExpiresActive On

# Cache all files for 2 weeks after access (A).
ExpiresDefault A1209600

Вот то, что вам нужно.
Можно заменить на:

ExpiresDefault "access plus 6 month"

что даст вам время устаревания кеша статики в пол года.

Аватар пользователя Anjela Anjela 1 февраля 2020 в 2:01

Нет, это не помогает.
Это я пробовала и раньше, причем и в разных вариациях тоже.
Я не пробовала вариант с Cache-Control: max-age=604800
Точнее пробовала, но я не знаю как правильно прописать или может куда конкретно

Я прописывала следующее
# 1 Month for most static assets

Header set Cache-Control "max-age=2592000"

В итоге у меня был белый экран

Аватар пользователя bsyomov bsyomov 1 февраля 2020 в 19:42

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

Аватар пользователя bsyomov bsyomov 2 февраля 2020 в 12:28

Добавьте там же ещё вот такой блок:

ExpiresByType js/javascript "access plus 6 months"
ExpiresByType text/css "access plus 6 months"
ExpiresByType image/png "access plus 6 months"
ExpiresByType image/jpeg "access plus 6 months"
Аватар пользователя bsyomov bsyomov 3 февраля 2020 в 15:26

Ну и отлично, всё получилось - у вас остались там только внешние ресурсы(usocial и яндекс метрика), на expires которых вы не можете повлиять, если только отключить их, если они не нужны.

Аватар пользователя Anjela Anjela 3 февраля 2020 в 16:05

Борис, в первую очередь хочу Вам сказать большое спасибо за помощь)

И если, Вы не против еще один вопрос -

Чтобы добавить вот это
# One month for most static assets

Header set Cache-Control "max-age=31536000, public"

Я полностью удалила вот это

# Do not allow PHP scripts to be cached unless they explicitly send cache
# headers themselves. Otherwise all scripts would have to overwrite the
# headers set by mod_expires if they want another caching behavior. This may
# fail if an error occurs early in the bootstrap process, and it may cause
# problems if a non-Drupal PHP file is installed in a subdirectory.
ExpiresActive Off

Это правильно или это не нужно удалять?

Аватар пользователя Anjela Anjela 1 февраля 2020 в 2:29

Я не специалист, но может это играет роль - у меня Веб-сервер Nginx
И я вычитала, что для этого сервера, совсем другое прописывать нужно
location ~* \.(js|css|png|jpg|jpeg|gif)$ {
expires 86400s;
log_not_found off;
}

Вопрос - куда именно?
Или я совсем не туда смотрю?

Аватар пользователя bsyomov bsyomov 1 февраля 2020 в 19:45

В вашем случае, вероятнее всего, nginx является reverse proxy, и все запросы без изменений передаёт apache. Скорее всего никакого доступа к конфигу nginx у вас нет, да и не нужен он вам.

Аватар пользователя adano adano 2 февраля 2020 в 21:27
1

Васек, это наиглупейшее решение.

Сейчас метрика ставится с обновленным кодом под вебвизор 2.0 и контентной аналитикой микроразметки.
И это все должно быть в "зеленой зоне".