6 заметок с тегом

htaccess

Apache: Боты Ahrefs озверели!

Есть замечательный для SEO-оптимизаторов сервис, который называется Ahrefs. Позволяет собирать информацию по различным сайтам, сравнивать её с другими сайтами и как следствие создавать правильную картинку о конкурентах.

А вот сегодня я был обескуражен количеством обращений к простому интернет-магазину от этих товарищей:

351    13.30%  Mozilla/5.0 (compatible; AhrefsBot/5.2; +http://ahrefs.com/robot/)

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

<ifModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} ^.*(AhrefsBot|SemrushBot).*$ [NC]
RewriteRule .* - [F,L]
</ifModule>

Отловим Ahrefs (и Semrush туда же) по user-agent через htaccess и покажем им 403 ошибку.
Нагрузки нет, хостинг доволен, ограничения сняты, клиент в восторге. Работаем дальше.

2018   htaccess

Включаем кеширование для Google Pagespeed

Открываем .htaccess и добавляем:

<ifModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/plain text/xml application/xml application/xhtml+xml text/css text/javascript application/javascript application/x-javascript
</ifModule>
 
# кеш браузера
<ifModule mod_expires.c>
ExpiresActive On
 
#по умолчанию кеш в 5 секунд
ExpiresDefault "access plus 1 days"
 
# Включаем кэширование изображений и флэш на месяц
ExpiresByType image/x-icon "access plus 1 month"
ExpiresByType image/jpeg "access plus 4 weeks"
ExpiresByType image/png "access plus 30 days"
ExpiresByType image/gif "access plus 43829 minutes"
ExpiresByType application/x-shockwave-flash "access plus 2592000 seconds"
 
# Включаем кэширование css, javascript и текстовых файлоф на одну неделю
ExpiresByType text/css "access plus 604800 seconds"
ExpiresByType text/javascript "access plus 604800 seconds"
ExpiresByType application/javascript "access plus 604800 seconds"
ExpiresByType application/x-javascript "access plus 604800 seconds"
 
# Включаем кэширование html и htm файлов на один день
ExpiresByType text/html "access plus 43200 seconds"
 
# Включаем кэширование xml файлов на десять минут
ExpiresByType application/xhtml+xml "access plus 600 seconds"
 
# Нестандартные шрифты сайта 
ExpiresByType application/x-font-ttf "access plus 1 month"
ExpiresByType font/opentype "access plus 1 month"
ExpiresByType application/x-font-woff "access plus 1 month"
ExpiresByType image/svg+xml "access plus 1 month"
ExpiresByType application/vnd.ms-fontobject "access plus 1 month"
</ifModule>
2018   htaccess

301 редирект на SSL

Проверенный вариант, без циклической переадресации.
Открываем .htaccess и пишем:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
2018   htaccess

500 Internal Server Error — больше деталей

Часто из-за конфликтов Friendly URL, мы можем увидеть подобную ошибку, которую нужно как то вылечить. И первым шагом для её решения — это подключить детальный вывод ошибок. Для этого открываем .htaccess и в самом начале пишем:

php_flag display_startup_errors on
php_flag display_errors on
php_flag html_errors on

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

2018   htaccess

Simpla CMS: JS & CSS Minify + Combine

Велосипед не мой, но очень полезный. Сначала поработаем под капотом:

  1. Распаковать из архива в корень сайта файлы
  2. Добавим в api/Simpla.php:
'js'     => 'Javascript',
'css'     => 'Stylesheet',
  1. Добавим в файл view/View.php после строки:
$this->design->smarty->registerPlugin('block', 'js',        array($this, 'add_javascript_block'));
$this->design->smarty->registerPlugin('function', 'unset_js',        array($this, 'unset_javascript_function'));
$this->design->smarty->registerPlugin('function', 'javascript',        array($this, 'print_javascript'));
$this->design->smarty->registerPlugin('block', 'css',        array($this, 'add_stylesheet_block'));
$this->design->smarty->registerPlugin('function', 'unset_css',        array($this, 'unset_stylesheet_function'));
$this->design->smarty->registerPlugin('function', 'stylesheet',        array($this, 'print_stylesheet'));
  1. Далее в этом же файле перед строкой:
public function get_discounted_products_plugin($params, &$smarty)

Добавим:

public function add_javascript_block($params, $content, $smarty, &$repeat)
    {
        if(!isset($params['id']) || $repeat || (empty($content)) && empty($params['include']))
            return false;
        if(!isset($params['priority']))
            $params['priority'] = 10;
        if(!empty($params['include']))
            $this->js->add_files($params['id'], $params['include'], $params['priority']);
        if(!empty($content))
            $this->js->add_code($params['id'], $content, $params['priority']);
        if(!empty($params['render']))
        {
            if(!isset($params['minify']))
                $params['minify'] = null;    
            if(!isset($params['combine']))
                $params['combine'] = true;
            return $this->js->render($params['id'], $params['minify'], $params['combine']);
        }
    }    
    public function unset_javascript_function($params, $smarty)
    {
        if(!isset($params['id']))
            return false;
        $this->js->unplug($params['id']);
    }
    public function print_javascript($params)
    {
        if(!isset($params['id']))
            $params['id'] = null;
        if(!isset($params['combine']))
            $params['combine'] = true;
        if(!isset($params['minify']))
            $params['minify'] = null;
        return $this->js->render($params['id'], $params['minify'], $params['combine']);
    }    
    public function add_stylesheet_block($params, $content, $smarty, &$repeat)
    {
        if(!isset($params['id']) || $repeat || (empty($content)) && empty($params['include']))
            return false;
        if(!isset($params['priority']))
            $params['priority'] = 10;
        if(!isset($params['less']))
            $params['less'] = false;
        if(!empty($params['include']))
            $this->css->add_files($params['id'], $params['include'], $params['priority'], $params['less']);
        if(!empty($content))
            $this->css->add_code($params['id'], $content, $params['priority'], $params['less']);
        if(!empty($params['render']))
        {
            if(!isset($params['minify']))
                $params['minify'] = null;    
            if(!isset($params['combine']))
                $params['combine'] = true;
            return $this->css->render($params['id'], $params['minify'], $params['combine']);
        }
    }    
    public function unset_stylesheet_function($params, $smarty)
    {
        if(!isset($params['id']))
            return false;
        $this->css->unplug($params['id']);
    }
    public function print_stylesheet($params)
    {
        if(!isset($params['id']))
            $params['id'] = null;
        if(!isset($params['combine']))
            $params['combine'] = true;
        if(!isset($params['minify']))
            $params['minify'] = null;
        return $this->css->render($params['id'], $params['minify'], $params['combine']);
    }
  1. В config-файл добавляем:
minify_js    = false;
minify_css    = false;
minify_gzip_level    = 0;
minify_cache_dir    = cache/minify/;
  1. В .htaccess после RewriteEngine on добавляем:
<FilesMatch "(js|css).gz[1-9]$">
	<IfModule mod_headers.c>
		Header set Content-Encoding: gzip
	</IfModule>
    <FilesMatch "css.gz[1-9]$">
        ForceType text/css
    </FilesMatch>
    <FilesMatch "js.gz[1-9]$">
        ForceType text/javascript
    </FilesMatch>
</FilesMatch>
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^cache/minify/(.+).gz([1-9])$ resize/gzip.php [L,END]

Чтобы всё заработало:

{stylesheet minify=true}
{javascript combine=true}

Группировка файлов:

{css id="libs" include=[
"design/{$settings->theme}/css/bootstrap.css",
"design/{$settings->theme}/css/animate.css",
"design/{$settings->theme}/css/style.css"
]}{/css}

{js id="libs" priority=99 include=[
"design/{$settings->theme}/js/jquery-2.1.1.min.js",
"design/{$settings->theme}/js/bootstrap.min.js"
]}{/js}

Функции принимают параметры:

id — служит для идентификации (обязательный параметр)
include — строка или массив строк для добавления в очередь
priority — приоритет вывода. По умолчанию равен 10 (если не указывать файлы будут становится один за одним согласно вызову функций) Чем больше приоритет тем он быстрее будет на выводе
less — если установлено true то данному ресурсу будет применен синтаксис less и перекодирован в css. (по умолчанию: false)
render — если данный параметр установлен в true то код на очередь не станет, а будет выведен прямо в месте вызова функции. Параметры minify и combine буриться глобальные.
minify — если данный параметр установлен в true то к данному ресурсу будет применяться сжатие. Если false — то файлы принадлежащие данному id не будут сжиматься. (по умолчанию: значение config.php)
combine — если данный параметр установлен в true то к данному ресурсу будет применяться упаковка в один файл. Если false — то файлы принадлежащие данному id не будут паковаться в один файл. (по умолчанию: значение config.php)

2018   htaccess   simplacms

Выключаем PHP notice и warning в htaccess

php_flag display_startup_errors off
php_flag display_errors off
php_flag html_errors off
php_flag log_errors on
php_flag ignore_repeated_errors off
php_flag ignore_repeated_source off
php_flag report_memleaks on
php_flag track_errors on
php_value docref_root 0
php_value docref_ext 0
php_value error_log /home/path/public_html/domain/PHP_errors.log
php_value error_reporting -1
php_value log_errors_max_len 0
2018   htaccess