{
    "version": "https:\/\/jsonfeed.org\/version\/1",
    "title": "Блог Чуденкова Алексея, заметки с тегом: htaccess",
    "home_page_url": "https:\/\/blog.chudenkov.ru\/tags\/htaccess\/",
    "feed_url": "https:\/\/blog.chudenkov.ru\/tags\/htaccess\/json\/",
    "icon": "https:\/\/blog.chudenkov.ru\/user\/userpic@2x.jpg",
    "author": {
        "name": "Чуденков Алексей",
        "url": "https:\/\/blog.chudenkov.ru\/",
        "avatar": "https:\/\/blog.chudenkov.ru\/user\/userpic@2x.jpg"
    },
    "items": [
        {
            "id": "32",
            "url": "https:\/\/blog.chudenkov.ru\/all\/boty-ahrefs-ozvereli\/",
            "title": "Apache: Боты Ahrefs озверели!",
            "content_html": "<p>Есть замечательный для SEO-оптимизаторов сервис, который называется Ahrefs. Позволяет собирать информацию по различным сайтам, сравнивать её с другими сайтами и как следствие создавать правильную картинку о конкурентах.<\/p>\n<p>А вот сегодня я был обескуражен количеством обращений к простому интернет-магазину от этих товарищей:<\/p>\n<pre class=\"e2-text-code\"><code>351    13.30%  Mozilla\/5.0 (compatible; AhrefsBot\/5.2; +http:\/\/ahrefs.com\/robot\/)<\/code><\/pre><p>Техподдержка хостинга мне маякнула, что они тоже обескуражены и решила ограничить доступ к сайту, от чего я был ещё более обескуражен данным действием. И пришлось решать вопрос ребром <s>и заблокировать эти чёртовы парсеры интернета<\/s>:<\/p>\n<pre class=\"e2-text-code\"><code>&lt;ifModule mod_rewrite.c&gt;\r\nRewriteEngine On\r\nRewriteCond %{HTTP_USER_AGENT} ^.*(AhrefsBot|SemrushBot).*$ [NC]\r\nRewriteRule .* - [F,L]\r\n&lt;\/ifModule&gt;<\/code><\/pre><p>Отловим Ahrefs (и Semrush туда же) по user-agent через htaccess и покажем им 403 ошибку.<br \/>\nНагрузки нет, хостинг доволен, ограничения сняты, клиент в восторге. Работаем дальше.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/blog.chudenkov.ru\/pictures\/Screenshot_5_1.jpg\" width=\"1288\" height=\"114\" alt=\"\" \/>\n<\/div>\n",
            "date_published": "2018-04-21T01:41:56+03:00",
            "date_modified": "2018-05-08T15:41:30+03:00",
            "image": "https:\/\/blog.chudenkov.ru\/pictures\/Screenshot_5_1.jpg",
            "_date_published_rfc2822": "Sat, 21 Apr 2018 01:41:56 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "32",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": [
                    "https:\/\/blog.chudenkov.ru\/pictures\/Screenshot_5_1.jpg"
                ]
            }
        },
        {
            "id": "6",
            "url": "https:\/\/blog.chudenkov.ru\/all\/vklyuchaem-keshirovanie-dlya-google-pagespeed\/",
            "title": "Включаем кеширование для Google Pagespeed",
            "content_html": "<p>Открываем .htaccess и добавляем:<\/p>\n<pre class=\"e2-text-code\"><code>&lt;ifModule mod_deflate.c&gt;\r\nAddOutputFilterByType DEFLATE text\/html text\/plain text\/xml application\/xml application\/xhtml+xml text\/css text\/javascript application\/javascript application\/x-javascript\r\n&lt;\/ifModule&gt;\r\n \r\n# кеш браузера\r\n&lt;ifModule mod_expires.c&gt;\r\nExpiresActive On\r\n \r\n#по умолчанию кеш в 5 секунд\r\nExpiresDefault &quot;access plus 1 days&quot;\r\n \r\n# Включаем кэширование изображений и флэш на месяц\r\nExpiresByType image\/x-icon &quot;access plus 1 month&quot;\r\nExpiresByType image\/jpeg &quot;access plus 4 weeks&quot;\r\nExpiresByType image\/png &quot;access plus 30 days&quot;\r\nExpiresByType image\/gif &quot;access plus 43829 minutes&quot;\r\nExpiresByType application\/x-shockwave-flash &quot;access plus 2592000 seconds&quot;\r\n \r\n# Включаем кэширование css, javascript и текстовых файлоф на одну неделю\r\nExpiresByType text\/css &quot;access plus 604800 seconds&quot;\r\nExpiresByType text\/javascript &quot;access plus 604800 seconds&quot;\r\nExpiresByType application\/javascript &quot;access plus 604800 seconds&quot;\r\nExpiresByType application\/x-javascript &quot;access plus 604800 seconds&quot;\r\n \r\n# Включаем кэширование html и htm файлов на один день\r\nExpiresByType text\/html &quot;access plus 43200 seconds&quot;\r\n \r\n# Включаем кэширование xml файлов на десять минут\r\nExpiresByType application\/xhtml+xml &quot;access plus 600 seconds&quot;\r\n \r\n# Нестандартные шрифты сайта \r\nExpiresByType application\/x-font-ttf &quot;access plus 1 month&quot;\r\nExpiresByType font\/opentype &quot;access plus 1 month&quot;\r\nExpiresByType application\/x-font-woff &quot;access plus 1 month&quot;\r\nExpiresByType image\/svg+xml &quot;access plus 1 month&quot;\r\nExpiresByType application\/vnd.ms-fontobject &quot;access plus 1 month&quot;\r\n&lt;\/ifModule&gt;<\/code><\/pre>",
            "date_published": "2018-03-18T16:59:57+03:00",
            "date_modified": "2018-03-18T16:59:44+03:00",
            "_date_published_rfc2822": "Sun, 18 Mar 2018 16:59:57 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "6",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "3",
            "url": "https:\/\/blog.chudenkov.ru\/all\/301-redirekt-na-ssl\/",
            "title": "301 редирект на SSL",
            "content_html": "<p>Проверенный вариант, без циклической переадресации.<br \/>\nОткрываем .htaccess и пишем:<\/p>\n<pre class=\"e2-text-code\"><code>RewriteEngine On\r\nRewriteCond %{HTTPS} off\r\nRewriteCond %{HTTP:X-Forwarded-Proto} !https\r\nRewriteRule ^(.*)$ https:\/\/%{HTTP_HOST}%{REQUEST_URI} [L,R=301]<\/code><\/pre>",
            "date_published": "2018-03-18T15:45:39+03:00",
            "date_modified": "2018-03-18T15:45:33+03:00",
            "_date_published_rfc2822": "Sun, 18 Mar 2018 15:45:39 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "3",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "2",
            "url": "https:\/\/blog.chudenkov.ru\/all\/500-internal-server-error-bolshe-detaley\/",
            "title": "500 Internal Server Error — больше деталей",
            "content_html": "<p>Часто из-за конфликтов Friendly URL, мы можем увидеть подобную ошибку, которую нужно как то вылечить. И первым шагом для её решения — это подключить детальный вывод ошибок. Для этого открываем .htaccess и в самом начале пишем:<\/p>\n<pre class=\"e2-text-code\"><code>php_flag display_startup_errors on\r\nphp_flag display_errors on\r\nphp_flag html_errors on<\/code><\/pre><p>После мы увидим конкретный файл и строчку, которая мешает полноценной загрузке файла.<\/p>\n",
            "date_published": "2018-03-18T15:38:56+03:00",
            "date_modified": "2018-03-18T15:38:51+03:00",
            "_date_published_rfc2822": "Sun, 18 Mar 2018 15:38:56 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "2",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "51",
            "url": "https:\/\/blog.chudenkov.ru\/all\/simpla-cms-301-redirect-dobavlyaem-slesh-na-konce-url\/",
            "title": "Simpla CMS: 301 Redirect добавляем слеш на конце URL",
            "content_html": "<p>В .htaccess после «RewriteEngine on» добавить:<\/p>\n<pre class=\"e2-text-code\"><code>RewriteCond %{REQUEST_URI} !\\?\r\nRewriteCond %{REQUEST_URI} !\\&amp;\r\nRewriteCond %{REQUEST_URI} !\\=\r\nRewriteCond %{REQUEST_URI} !\\.\r\nRewriteCond %{REQUEST_URI} !\\\/$\r\nRewriteRule ^(.*[^\\\/])$ \/$1\/ [R=301,L]<\/code><\/pre>",
            "date_published": "2018-03-02T13:26:00+03:00",
            "date_modified": "2018-12-19T13:26:25+03:00",
            "_date_published_rfc2822": "Fri, 02 Mar 2018 13:26:00 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "51",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "47",
            "url": "https:\/\/blog.chudenkov.ru\/all\/simpla-cms-js-css-minify-combine\/",
            "title": "Simpla CMS: JS &amp; CSS Minify + Combine",
            "content_html": "<p>Велосипед не мой, но очень полезный. Сначала поработаем под капотом:<br \/><\/p>\n<ol start=\"1\">\n<li>Распаковать из архива в корень сайта <a href=\"https:\/\/yadi.sk\/d\/9e9vdmvlXnoMsA\">файлы<\/a><\/li>\n<li>Добавим в api\/Simpla.php:<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code>'js'     =&gt; 'Javascript',\r\n'css'     =&gt; 'Stylesheet',<\/code><\/pre><ol start=\"3\">\n<li>Добавим в файл view\/View.php после строки:<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code>$this-&gt;design-&gt;smarty-&gt;registerPlugin('block', 'js',        array($this, 'add_javascript_block'));\r\n$this-&gt;design-&gt;smarty-&gt;registerPlugin('function', 'unset_js',        array($this, 'unset_javascript_function'));\r\n$this-&gt;design-&gt;smarty-&gt;registerPlugin('function', 'javascript',        array($this, 'print_javascript'));\r\n$this-&gt;design-&gt;smarty-&gt;registerPlugin('block', 'css',        array($this, 'add_stylesheet_block'));\r\n$this-&gt;design-&gt;smarty-&gt;registerPlugin('function', 'unset_css',        array($this, 'unset_stylesheet_function'));\r\n$this-&gt;design-&gt;smarty-&gt;registerPlugin('function', 'stylesheet',        array($this, 'print_stylesheet'));<\/code><\/pre><ol start=\"4\">\n<li>Далее в этом же файле перед строкой:<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code>public function get_discounted_products_plugin($params, &amp;$smarty)<\/code><\/pre><p>Добавим:<\/p>\n<pre class=\"e2-text-code\"><code>public function add_javascript_block($params, $content, $smarty, &amp;$repeat)\r\n    {\r\n        if(!isset($params['id']) || $repeat || (empty($content)) &amp;&amp; empty($params['include']))\r\n            return false;\r\n        if(!isset($params['priority']))\r\n            $params['priority'] = 10;\r\n        if(!empty($params['include']))\r\n            $this-&gt;js-&gt;add_files($params['id'], $params['include'], $params['priority']);\r\n        if(!empty($content))\r\n            $this-&gt;js-&gt;add_code($params['id'], $content, $params['priority']);\r\n        if(!empty($params['render']))\r\n        {\r\n            if(!isset($params['minify']))\r\n                $params['minify'] = null;    \r\n            if(!isset($params['combine']))\r\n                $params['combine'] = true;\r\n            return $this-&gt;js-&gt;render($params['id'], $params['minify'], $params['combine']);\r\n        }\r\n    }    \r\n    public function unset_javascript_function($params, $smarty)\r\n    {\r\n        if(!isset($params['id']))\r\n            return false;\r\n        $this-&gt;js-&gt;unplug($params['id']);\r\n    }\r\n    public function print_javascript($params)\r\n    {\r\n        if(!isset($params['id']))\r\n            $params['id'] = null;\r\n        if(!isset($params['combine']))\r\n            $params['combine'] = true;\r\n        if(!isset($params['minify']))\r\n            $params['minify'] = null;\r\n        return $this-&gt;js-&gt;render($params['id'], $params['minify'], $params['combine']);\r\n    }    \r\n    public function add_stylesheet_block($params, $content, $smarty, &amp;$repeat)\r\n    {\r\n        if(!isset($params['id']) || $repeat || (empty($content)) &amp;&amp; empty($params['include']))\r\n            return false;\r\n        if(!isset($params['priority']))\r\n            $params['priority'] = 10;\r\n        if(!isset($params['less']))\r\n            $params['less'] = false;\r\n        if(!empty($params['include']))\r\n            $this-&gt;css-&gt;add_files($params['id'], $params['include'], $params['priority'], $params['less']);\r\n        if(!empty($content))\r\n            $this-&gt;css-&gt;add_code($params['id'], $content, $params['priority'], $params['less']);\r\n        if(!empty($params['render']))\r\n        {\r\n            if(!isset($params['minify']))\r\n                $params['minify'] = null;    \r\n            if(!isset($params['combine']))\r\n                $params['combine'] = true;\r\n            return $this-&gt;css-&gt;render($params['id'], $params['minify'], $params['combine']);\r\n        }\r\n    }    \r\n    public function unset_stylesheet_function($params, $smarty)\r\n    {\r\n        if(!isset($params['id']))\r\n            return false;\r\n        $this-&gt;css-&gt;unplug($params['id']);\r\n    }\r\n    public function print_stylesheet($params)\r\n    {\r\n        if(!isset($params['id']))\r\n            $params['id'] = null;\r\n        if(!isset($params['combine']))\r\n            $params['combine'] = true;\r\n        if(!isset($params['minify']))\r\n            $params['minify'] = null;\r\n        return $this-&gt;css-&gt;render($params['id'], $params['minify'], $params['combine']);\r\n    }<\/code><\/pre><ol start=\"5\">\n<li>В config-файл добавляем:<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code>minify_js    = false;\r\nminify_css    = false;\r\nminify_gzip_level    = 0;\r\nminify_cache_dir    = cache\/minify\/;<\/code><\/pre><ol start=\"6\">\n<li>В .htaccess после RewriteEngine on добавляем:<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code>&lt;FilesMatch &quot;(js|css).gz[1-9]$&quot;&gt;\r\n\t&lt;IfModule mod_headers.c&gt;\r\n\t\tHeader set Content-Encoding: gzip\r\n\t&lt;\/IfModule&gt;\r\n    &lt;FilesMatch &quot;css.gz[1-9]$&quot;&gt;\r\n        ForceType text\/css\r\n    &lt;\/FilesMatch&gt;\r\n    &lt;FilesMatch &quot;js.gz[1-9]$&quot;&gt;\r\n        ForceType text\/javascript\r\n    &lt;\/FilesMatch&gt;\r\n&lt;\/FilesMatch&gt;\r\nRewriteCond %{REQUEST_FILENAME} !-d\r\nRewriteCond %{REQUEST_FILENAME} !-f\r\nRewriteRule ^cache\/minify\/(.+).gz([1-9])$ resize\/gzip.php [L,END]<\/code><\/pre><p>Чтобы всё заработало:<\/p>\n<pre class=\"e2-text-code\"><code>{stylesheet minify=true}\r\n{javascript combine=true}<\/code><\/pre><p>Группировка файлов:<\/p>\n<pre class=\"e2-text-code\"><code>{css id=&quot;libs&quot; include=[\r\n&quot;design\/{$settings-&gt;theme}\/css\/bootstrap.css&quot;,\r\n&quot;design\/{$settings-&gt;theme}\/css\/animate.css&quot;,\r\n&quot;design\/{$settings-&gt;theme}\/css\/style.css&quot;\r\n]}{\/css}\r\n\r\n{js id=&quot;libs&quot; priority=99 include=[\r\n&quot;design\/{$settings-&gt;theme}\/js\/jquery-2.1.1.min.js&quot;,\r\n&quot;design\/{$settings-&gt;theme}\/js\/bootstrap.min.js&quot;\r\n]}{\/js}<\/code><\/pre><p>Функции принимают параметры:<\/p>\n<p><b>id<\/b> — служит для идентификации (обязательный параметр)<br \/>\n<b>include<\/b> — строка или массив строк для добавления в очередь<br \/>\n<b>priority<\/b> — приоритет вывода. По умолчанию равен 10 (если не указывать файлы будут становится один за одним согласно вызову функций) Чем больше приоритет тем он быстрее будет на выводе<br \/>\n<b>less<\/b> — если установлено true то данному ресурсу будет применен синтаксис less и перекодирован в css. (по умолчанию: false)<br \/>\n<b>render<\/b> — если данный параметр установлен в true то код на очередь не станет, а будет выведен прямо в месте вызова функции. Параметры minify и combine буриться глобальные.<br \/>\n<b>minify<\/b> — если данный параметр установлен в true то к данному ресурсу будет применяться сжатие. Если false — то файлы принадлежащие данному id не будут сжиматься. (по умолчанию: значение config.php)<br \/>\n<b>combine<\/b> — если данный параметр установлен в true то к данному ресурсу будет применяться упаковка в один файл. Если false — то файлы принадлежащие данному id не будут паковаться в один файл. (по умолчанию: значение config.php)<\/p>\n",
            "date_published": "2018-02-13T00:00:00+03:00",
            "date_modified": "2018-09-29T13:46:44+03:00",
            "_date_published_rfc2822": "Tue, 13 Feb 2018 00:00:00 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "47",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        },
        {
            "id": "44",
            "url": "https:\/\/blog.chudenkov.ru\/all\/vyklyuchaem-php-notice-i-warning-v-htaccess\/",
            "title": "Выключаем PHP notice и warning в htaccess",
            "content_html": "<pre class=\"e2-text-code\"><code>php_flag display_startup_errors off\r\nphp_flag display_errors off\r\nphp_flag html_errors off\r\nphp_flag log_errors on\r\nphp_flag ignore_repeated_errors off\r\nphp_flag ignore_repeated_source off\r\nphp_flag report_memleaks on\r\nphp_flag track_errors on\r\nphp_value docref_root 0\r\nphp_value docref_ext 0\r\nphp_value error_log \/home\/path\/public_html\/domain\/PHP_errors.log\r\nphp_value error_reporting -1\r\nphp_value log_errors_max_len 0<\/code><\/pre>",
            "date_published": "2018-02-12T20:32:00+03:00",
            "date_modified": "2018-09-21T20:32:46+03:00",
            "_date_published_rfc2822": "Mon, 12 Feb 2018 20:32:00 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "44",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": []
            }
        }
    ],
    "_e2_version": 3365,
    "_e2_ua_string": "E2 (v3365; Aegea)"
}