<?xml version="1.0" encoding="utf-8"?> 
<rss version="2.0">

<channel>

<title>Блог Чуденкова Алексея, заметки с тегом: htaccess</title>
<link>https://blog.chudenkov.ru/tags/htaccess/</link>
<description></description>
<generator>E2 (v3365; Aegea)</generator>

<item>
<title>Apache: Боты Ahrefs озверели!</title>
<guid isPermaLink="false">32</guid>
<link>https://blog.chudenkov.ru/all/boty-ahrefs-ozvereli/</link>
<comments>https://blog.chudenkov.ru/all/boty-ahrefs-ozvereli/</comments>
<description>
&lt;p&gt;Есть замечательный для SEO-оптимизаторов сервис, который называется Ahrefs. Позволяет собирать информацию по различным сайтам, сравнивать её с другими сайтами и как следствие создавать правильную картинку о конкурентах.&lt;/p&gt;
&lt;p&gt;А вот сегодня я был обескуражен количеством обращений к простому интернет-магазину от этих товарищей:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;351    13.30%  Mozilla/5.0 (compatible; AhrefsBot/5.2; +http://ahrefs.com/robot/)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Техподдержка хостинга мне маякнула, что они тоже обескуражены и решила ограничить доступ к сайту, от чего я был ещё более обескуражен данным действием. И пришлось решать вопрос ребром &lt;s&gt;и заблокировать эти чёртовы парсеры интернета&lt;/s&gt;:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;&amp;lt;ifModule mod_rewrite.c&amp;gt;
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} ^.*(AhrefsBot|SemrushBot).*$ [NC]
RewriteRule .* - [F,L]
&amp;lt;/ifModule&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Отловим Ahrefs (и Semrush туда же) по user-agent через htaccess и покажем им 403 ошибку.&lt;br /&gt;
Нагрузки нет, хостинг доволен, ограничения сняты, клиент в восторге. Работаем дальше.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://blog.chudenkov.ru/pictures/Screenshot_5_1.jpg" width="1288" height="114" alt="" /&gt;
&lt;/div&gt;
</description>
<pubDate>Sat, 21 Apr 2018 01:41:56 +0300</pubDate>
</item>

<item>
<title>Включаем кеширование для Google Pagespeed</title>
<guid isPermaLink="false">6</guid>
<link>https://blog.chudenkov.ru/all/vklyuchaem-keshirovanie-dlya-google-pagespeed/</link>
<comments>https://blog.chudenkov.ru/all/vklyuchaem-keshirovanie-dlya-google-pagespeed/</comments>
<description>
&lt;p&gt;Открываем .htaccess и добавляем:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;&amp;lt;ifModule mod_deflate.c&amp;gt;
AddOutputFilterByType DEFLATE text/html text/plain text/xml application/xml application/xhtml+xml text/css text/javascript application/javascript application/x-javascript
&amp;lt;/ifModule&amp;gt;
 
# кеш браузера
&amp;lt;ifModule mod_expires.c&amp;gt;
ExpiresActive On
 
#по умолчанию кеш в 5 секунд
ExpiresDefault &amp;quot;access plus 1 days&amp;quot;
 
# Включаем кэширование изображений и флэш на месяц
ExpiresByType image/x-icon &amp;quot;access plus 1 month&amp;quot;
ExpiresByType image/jpeg &amp;quot;access plus 4 weeks&amp;quot;
ExpiresByType image/png &amp;quot;access plus 30 days&amp;quot;
ExpiresByType image/gif &amp;quot;access plus 43829 minutes&amp;quot;
ExpiresByType application/x-shockwave-flash &amp;quot;access plus 2592000 seconds&amp;quot;
 
# Включаем кэширование css, javascript и текстовых файлоф на одну неделю
ExpiresByType text/css &amp;quot;access plus 604800 seconds&amp;quot;
ExpiresByType text/javascript &amp;quot;access plus 604800 seconds&amp;quot;
ExpiresByType application/javascript &amp;quot;access plus 604800 seconds&amp;quot;
ExpiresByType application/x-javascript &amp;quot;access plus 604800 seconds&amp;quot;
 
# Включаем кэширование html и htm файлов на один день
ExpiresByType text/html &amp;quot;access plus 43200 seconds&amp;quot;
 
# Включаем кэширование xml файлов на десять минут
ExpiresByType application/xhtml+xml &amp;quot;access plus 600 seconds&amp;quot;
 
# Нестандартные шрифты сайта 
ExpiresByType application/x-font-ttf &amp;quot;access plus 1 month&amp;quot;
ExpiresByType font/opentype &amp;quot;access plus 1 month&amp;quot;
ExpiresByType application/x-font-woff &amp;quot;access plus 1 month&amp;quot;
ExpiresByType image/svg+xml &amp;quot;access plus 1 month&amp;quot;
ExpiresByType application/vnd.ms-fontobject &amp;quot;access plus 1 month&amp;quot;
&amp;lt;/ifModule&amp;gt;&lt;/code&gt;&lt;/pre&gt;</description>
<pubDate>Sun, 18 Mar 2018 16:59:57 +0300</pubDate>
</item>

<item>
<title>301 редирект на SSL</title>
<guid isPermaLink="false">3</guid>
<link>https://blog.chudenkov.ru/all/301-redirekt-na-ssl/</link>
<comments>https://blog.chudenkov.ru/all/301-redirekt-na-ssl/</comments>
<description>
&lt;p&gt;Проверенный вариант, без циклической переадресации.&lt;br /&gt;
Открываем .htaccess и пишем:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;RewriteEngine On
RewriteCond %{HTTPS} off
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]&lt;/code&gt;&lt;/pre&gt;</description>
<pubDate>Sun, 18 Mar 2018 15:45:39 +0300</pubDate>
</item>

<item>
<title>500 Internal Server Error — больше деталей</title>
<guid isPermaLink="false">2</guid>
<link>https://blog.chudenkov.ru/all/500-internal-server-error-bolshe-detaley/</link>
<comments>https://blog.chudenkov.ru/all/500-internal-server-error-bolshe-detaley/</comments>
<description>
&lt;p&gt;Часто из-за конфликтов Friendly URL, мы можем увидеть подобную ошибку, которую нужно как то вылечить. И первым шагом для её решения — это подключить детальный вывод ошибок. Для этого открываем .htaccess и в самом начале пишем:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;php_flag display_startup_errors on
php_flag display_errors on
php_flag html_errors on&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;После мы увидим конкретный файл и строчку, которая мешает полноценной загрузке файла.&lt;/p&gt;
</description>
<pubDate>Sun, 18 Mar 2018 15:38:56 +0300</pubDate>
</item>

<item>
<title>Simpla CMS: 301 Redirect добавляем слеш на конце URL</title>
<guid isPermaLink="false">51</guid>
<link>https://blog.chudenkov.ru/all/simpla-cms-301-redirect-dobavlyaem-slesh-na-konce-url/</link>
<comments>https://blog.chudenkov.ru/all/simpla-cms-301-redirect-dobavlyaem-slesh-na-konce-url/</comments>
<description>
&lt;p&gt;В .htaccess после «RewriteEngine on» добавить:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;RewriteCond %{REQUEST_URI} !\?
RewriteCond %{REQUEST_URI} !\&amp;amp;
RewriteCond %{REQUEST_URI} !\=
RewriteCond %{REQUEST_URI} !\.
RewriteCond %{REQUEST_URI} !\/$
RewriteRule ^(.*[^\/])$ /$1/ [R=301,L]&lt;/code&gt;&lt;/pre&gt;</description>
<pubDate>Fri, 02 Mar 2018 13:26:00 +0300</pubDate>
</item>

<item>
<title>Simpla CMS: JS &amp;amp; CSS Minify + Combine</title>
<guid isPermaLink="false">47</guid>
<link>https://blog.chudenkov.ru/all/simpla-cms-js-css-minify-combine/</link>
<comments>https://blog.chudenkov.ru/all/simpla-cms-js-css-minify-combine/</comments>
<description>
&lt;p&gt;Велосипед не мой, но очень полезный. Сначала поработаем под капотом:&lt;br /&gt;&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;Распаковать из архива в корень сайта &lt;a href="https://yadi.sk/d/9e9vdmvlXnoMsA"&gt;файлы&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Добавим в api/Simpla.php:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;'js'     =&amp;gt; 'Javascript',
'css'     =&amp;gt; 'Stylesheet',&lt;/code&gt;&lt;/pre&gt;&lt;ol start="3"&gt;
&lt;li&gt;Добавим в файл view/View.php после строки:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;$this-&amp;gt;design-&amp;gt;smarty-&amp;gt;registerPlugin('block', 'js',        array($this, 'add_javascript_block'));
$this-&amp;gt;design-&amp;gt;smarty-&amp;gt;registerPlugin('function', 'unset_js',        array($this, 'unset_javascript_function'));
$this-&amp;gt;design-&amp;gt;smarty-&amp;gt;registerPlugin('function', 'javascript',        array($this, 'print_javascript'));
$this-&amp;gt;design-&amp;gt;smarty-&amp;gt;registerPlugin('block', 'css',        array($this, 'add_stylesheet_block'));
$this-&amp;gt;design-&amp;gt;smarty-&amp;gt;registerPlugin('function', 'unset_css',        array($this, 'unset_stylesheet_function'));
$this-&amp;gt;design-&amp;gt;smarty-&amp;gt;registerPlugin('function', 'stylesheet',        array($this, 'print_stylesheet'));&lt;/code&gt;&lt;/pre&gt;&lt;ol start="4"&gt;
&lt;li&gt;Далее в этом же файле перед строкой:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;public function get_discounted_products_plugin($params, &amp;amp;$smarty)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Добавим:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;public function add_javascript_block($params, $content, $smarty, &amp;amp;$repeat)
    {
        if(!isset($params['id']) || $repeat || (empty($content)) &amp;amp;&amp;amp; empty($params['include']))
            return false;
        if(!isset($params['priority']))
            $params['priority'] = 10;
        if(!empty($params['include']))
            $this-&amp;gt;js-&amp;gt;add_files($params['id'], $params['include'], $params['priority']);
        if(!empty($content))
            $this-&amp;gt;js-&amp;gt;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-&amp;gt;js-&amp;gt;render($params['id'], $params['minify'], $params['combine']);
        }
    }    
    public function unset_javascript_function($params, $smarty)
    {
        if(!isset($params['id']))
            return false;
        $this-&amp;gt;js-&amp;gt;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-&amp;gt;js-&amp;gt;render($params['id'], $params['minify'], $params['combine']);
    }    
    public function add_stylesheet_block($params, $content, $smarty, &amp;amp;$repeat)
    {
        if(!isset($params['id']) || $repeat || (empty($content)) &amp;amp;&amp;amp; empty($params['include']))
            return false;
        if(!isset($params['priority']))
            $params['priority'] = 10;
        if(!isset($params['less']))
            $params['less'] = false;
        if(!empty($params['include']))
            $this-&amp;gt;css-&amp;gt;add_files($params['id'], $params['include'], $params['priority'], $params['less']);
        if(!empty($content))
            $this-&amp;gt;css-&amp;gt;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-&amp;gt;css-&amp;gt;render($params['id'], $params['minify'], $params['combine']);
        }
    }    
    public function unset_stylesheet_function($params, $smarty)
    {
        if(!isset($params['id']))
            return false;
        $this-&amp;gt;css-&amp;gt;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-&amp;gt;css-&amp;gt;render($params['id'], $params['minify'], $params['combine']);
    }&lt;/code&gt;&lt;/pre&gt;&lt;ol start="5"&gt;
&lt;li&gt;В config-файл добавляем:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;minify_js    = false;
minify_css    = false;
minify_gzip_level    = 0;
minify_cache_dir    = cache/minify/;&lt;/code&gt;&lt;/pre&gt;&lt;ol start="6"&gt;
&lt;li&gt;В .htaccess после RewriteEngine on добавляем:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;&amp;lt;FilesMatch &amp;quot;(js|css).gz[1-9]$&amp;quot;&amp;gt;
	&amp;lt;IfModule mod_headers.c&amp;gt;
		Header set Content-Encoding: gzip
	&amp;lt;/IfModule&amp;gt;
    &amp;lt;FilesMatch &amp;quot;css.gz[1-9]$&amp;quot;&amp;gt;
        ForceType text/css
    &amp;lt;/FilesMatch&amp;gt;
    &amp;lt;FilesMatch &amp;quot;js.gz[1-9]$&amp;quot;&amp;gt;
        ForceType text/javascript
    &amp;lt;/FilesMatch&amp;gt;
&amp;lt;/FilesMatch&amp;gt;
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^cache/minify/(.+).gz([1-9])$ resize/gzip.php [L,END]&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Чтобы всё заработало:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;{stylesheet minify=true}
{javascript combine=true}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Группировка файлов:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code&gt;{css id=&amp;quot;libs&amp;quot; include=[
&amp;quot;design/{$settings-&amp;gt;theme}/css/bootstrap.css&amp;quot;,
&amp;quot;design/{$settings-&amp;gt;theme}/css/animate.css&amp;quot;,
&amp;quot;design/{$settings-&amp;gt;theme}/css/style.css&amp;quot;
]}{/css}

{js id=&amp;quot;libs&amp;quot; priority=99 include=[
&amp;quot;design/{$settings-&amp;gt;theme}/js/jquery-2.1.1.min.js&amp;quot;,
&amp;quot;design/{$settings-&amp;gt;theme}/js/bootstrap.min.js&amp;quot;
]}{/js}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Функции принимают параметры:&lt;/p&gt;
&lt;p&gt;&lt;b&gt;id&lt;/b&gt; — служит для идентификации (обязательный параметр)&lt;br /&gt;
&lt;b&gt;include&lt;/b&gt; — строка или массив строк для добавления в очередь&lt;br /&gt;
&lt;b&gt;priority&lt;/b&gt; — приоритет вывода. По умолчанию равен 10 (если не указывать файлы будут становится один за одним согласно вызову функций) Чем больше приоритет тем он быстрее будет на выводе&lt;br /&gt;
&lt;b&gt;less&lt;/b&gt; — если установлено true то данному ресурсу будет применен синтаксис less и перекодирован в css. (по умолчанию: false)&lt;br /&gt;
&lt;b&gt;render&lt;/b&gt; — если данный параметр установлен в true то код на очередь не станет, а будет выведен прямо в месте вызова функции. Параметры minify и combine буриться глобальные.&lt;br /&gt;
&lt;b&gt;minify&lt;/b&gt; — если данный параметр установлен в true то к данному ресурсу будет применяться сжатие. Если false — то файлы принадлежащие данному id не будут сжиматься. (по умолчанию: значение config.php)&lt;br /&gt;
&lt;b&gt;combine&lt;/b&gt; — если данный параметр установлен в true то к данному ресурсу будет применяться упаковка в один файл. Если false — то файлы принадлежащие данному id не будут паковаться в один файл. (по умолчанию: значение config.php)&lt;/p&gt;
</description>
<pubDate>Tue, 13 Feb 2018 00:00:00 +0300</pubDate>
</item>

<item>
<title>Выключаем PHP notice и warning в htaccess</title>
<guid isPermaLink="false">44</guid>
<link>https://blog.chudenkov.ru/all/vyklyuchaem-php-notice-i-warning-v-htaccess/</link>
<comments>https://blog.chudenkov.ru/all/vyklyuchaem-php-notice-i-warning-v-htaccess/</comments>
<description>
&lt;pre class="e2-text-code"&gt;&lt;code&gt;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&lt;/code&gt;&lt;/pre&gt;</description>
<pubDate>Mon, 12 Feb 2018 20:32:00 +0300</pubDate>
</item>


</channel>
</rss>