Стандартный .htaccess

Для единообразия формирования URL страниц сайтов, и предотвращения появлений дубликатов страниц, вводится стандартная часть файла .htaccess.

Данный конфиг позволяет решить следующие задачи:

  • Активация канонических директив
  • Активация рекомендованных директив "Битрикс монитор качества"
  • Установить основное зеркало сайта с www  сохраняя протокол  http или https
  • Установка основного зеркала сайта без www сохраняя http или https
  • Перенаправление HTTP > HTTPS 
  • Перенаправление HTTPS > HTTP
  • Удалить любое количество "/" стоящих рядом; site.ru////catalog//item  > site.ru/catalog/item
  • Удалять "/" в конце URL если это файл
  • Добавлять "/" в конце URL если его там нет и это не файл. (работает в связке с вышестоящим, иногда требуется одно, иногда другое)
  • Удалить из URL index.php
  • Компрессия статического контента для GooglePagespeed тест
  • Добавлен AddType svg

Последовательность установки:

  1. Вставить код в начале .htaccess
  2. При вставке требуется указать правильное зеркало сайта, раскоментировав нужное, по умолчанию удаляет WWW, и включает HTTPS
  3. Удалить старый redirect перенаправление на основное зеркало.
  4. Если основное зеркало сайт HTTPS, то внесите протокол в robots.txt Host: https://site.ru, для http не требуется.
  5. Убедитесь что SSL сертификат выпущен и для зеркала www, в противном случае редирект не сработает
  6. При установке HTTPS основным зеркалом, перейти на свой сайт и убедиться в отсутствие blocked:mixed

Полезные сервисы

Код конфигурационного файла каталога .htaccess.

############################################################################
#### Стандартный .htaccess для проектов студии Клондайк, версия 4.6     ####
############################################################################
RewriteEngine On
   #  Директива включает редиректы.
RewriteBase / 
   # Без директивы (.*) = /$1 будет /var/wwww/site/web/$1  с директивой  = /$1
Options +FollowSymLinks
   # Разрешает переход по символическим ссылкам.
php_flag display_errors off
  # запретить отображение ошибок  (требование монитора качества)
php_flag allow_url_fopen off
  # запретить  использовать удаленные файлы (требование проактивной защиты)

############################################################################
#### Выбор основного зеркала (с www или без www)                        ####
############################################################################
    # 1. Удалить www
RewriteCond %{ENV:HTTPS} on
    #Если включен https
RewriteRule .* - [E=SSL:s]
    #То создаем переменную  ssl с текстом s
RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
    # Проверяем, содержит ли домен www в начале URL.
RewriteRule ^(.*)$ http%{ENV:SSL}://%1/$1 [R=301,L]
    # Перенаправляем удаляем www

    # 2. Добавить www
#RewriteCond %{ENV:HTTPS} on
    #Если включен https
#RewriteRule .* - [E=SSL:s]
    #То создаем переменную  ssl с текстом s
#RewriteCond %{HTTP_HOST} !^www\.(.*) [NC]
    # Если нет www в начале домена
#RewriteRule ^(.*)$ http%{ENV:SSL}://www.%{HTTP_HOST}/$1 [R=301,L]
    #Подставляем www и https если он включен.

############################################################################
#### Перенаправляем протокол https на http                              ####
############################################################################
#RewriteCond %{HTTPS} on
   # Проверяем наличие https в URL.
#RewriteRule ^.*$ http://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
   # Перенаправляем протокол на http.

############################################################################
#### Перенаправляем протокол http на https                              ####
############################################################################
RewriteCond %{HTTPS} off
   # Проверяем наличие https в URL.
RewriteCond %{REQUEST_URI} !^/bitrix/admin/1c_exchange\.php$ [NC] 
   #  Исключим обмен с 1С, ему требуется только 200 
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
   # Перенаправляем протокол на http.

############################################################################
#### Убираем index.php, если он есть в конце URL                        ####
############################################################################
RewriteCond %{REQUEST_URI} ^(.*)/index\.php$
   # URL cодержит index.php в конце.
RewriteCond %{REQUEST_METHOD} =GET
   # Выявляем GET запрос в URL (не POST).
RewriteRule ^(.*)$ %1/ [R=301,L]
   # Удалить index.php из URL.

############################################################################
#### Убираем повторяющиеся слеши (/) в URL                              ####
############################################################################
RewriteCond %{THE_REQUEST} //
   # Проверяем, повторяется ли слеш (//) более двух раз.
RewriteCond %{QUERY_STRING} !http(s|)://
  # Убедимся что это не урл в  GET
RewriteRule .* /$0 [R=301,L]
   # Исключаем все лишние слеши.

############################################################################
#### Убираем слеши в конце URL для статических файлов (содержит точку)  ####
############################################################################
RewriteCond %{REQUEST_URI} \..+$
   # Если файл содержит точку.
RewriteCond %{REQUEST_FILENAME} !-d
   # И это не директория.
RewriteCond %{REQUEST_FILENAME} -f
   # Является файлом.
RewriteCond %{REQUEST_URI} ^(.+)/$
   # И в конце URL есть слеш.
RewriteRule ^(.+)/$ /$1 [R=301,L]
   # Исключить слеш.

############################################################################
#### Добавляем слеш(/), если его нет, и это не файл.                    ####
############################################################################
RewriteCond %{REQUEST_URI} !(.*)/$
   # Если слеша в конце нет.
RewriteCond %{REQUEST_FILENAME} !-f
   # Не является файлом.
RewriteCond %{REQUEST_URI} !\..+$
   # В URL нет точки (файл).
RewriteCond %{REQUEST_URI} ^(.+)$
 # В URL есть хоть один символы
RewriteRule ^(.*)$ $1/ [L,R=301]
   # Добавляем слеш в конце.


############################################################################
#### Компрессия статического контента для гугл  спид тест               ####
############################################################################
<IfModule mod_deflate.c>
  AddType image/svg+xml .svg
  AddOutputFilterByType DEFLATE image/svg+xml  
  AddOutputFilterByType DEFLATE application/rss+xml
  AddOutputFilterByType DEFLATE application/vnd.ms-fontobject
  AddOutputFilterByType DEFLATE application/x-font
  AddOutputFilterByType DEFLATE application/x-font-opentype
  AddOutputFilterByType DEFLATE application/x-font-otf
  AddOutputFilterByType DEFLATE application/x-font-truetype
  AddOutputFilterByType DEFLATE application/x-font-ttf
  AddOutputFilterByType DEFLATE application/x-javascript
  AddOutputFilterByType DEFLATE application/xhtml+xml
  AddOutputFilterByType DEFLATE application/xml
  AddOutputFilterByType DEFLATE font/opentype
  AddOutputFilterByType DEFLATE font/otf
  AddOutputFilterByType DEFLATE font/ttf
  AddOutputFilterByType DEFLATE image/svg+xml
  AddOutputFilterByType DEFLATE image/x-icon
  AddOutputFilterByType DEFLATE text/css
  AddOutputFilterByType DEFLATE text/html
  AddOutputFilterByType DEFLATE text/javascript
  AddOutputFilterByType DEFLATE text/plain
  AddOutputFilterByType DEFLATE text/xml
  AddOutputFilterByType DEFLATE image/svg+xml
</IfModule>
<IfModule mod_expires.c>
  ExpiresActive on
  ExpiresByType image/jpeg "access plus 1 year"
  ExpiresByType image/svg "access plus 1 year"
  ExpiresByType image/gif "access plus 1 year"
  ExpiresByType image/png "access plus 1 year"
  ExpiresByType text/javascript "access plus 1 year"
  ExpiresByType text/css "access plus 1 year"
  ExpiresByType application/javascript "access plus 1 year"
  ExpiresByType application/vnd.ms-fontobject "access plus 1 year"
  ExpiresByType application/x-font-ttf "access plus 1 year"
  ExpiresByType application/x-font-opentype "access plus 1 year"
  ExpiresByType application/x-font-woff "access plus 1 year"
  ExpiresByType image/svg+xml "access plus 1 year"
</IfModule>
  <IfModule mod_headers.c>
  <filesmatch "\.(ico|flv|jpg|jpeg|webp|png|gif|css|swf|woff|pdf)$">
    Header set Cache-Control "max-age=31536000, public"
  </filesmatch>
  <filesmatch "\.(html|htm)$">
    Header set Cache-Control "max-age=7200, private, must-revalidate"
  </filesmatch>
  <filesmatch "\.(pdf)$">
    Header set Cache-Control "max-age=86400, public"
  </filesmatch>
  <filesmatch "\.(js|otf|ttf|woff|woff2)$">
    Header set Cache-Control "max-age=31536000, private"
  </filesmatch>
  </IfModule>
############################################################################
#### Конец общей части, далее следует собственные директивы .htaccess   ####
############################################################################

Если есть проблема с зацикливанием https

В случае работы nginx+apache возможен циклический  редирект HTTP>HTTPS вызваны неправильными настройками сервера (не файла), Используя на backand http вместо https и по какой-то причине не могут передать протокол обращения от nginx в apache. В таком случае нужно  отключить редирект на https и исправить ошибку или в веб сервере или подобрать подходящее  условие, как правило подойдет:

 RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTPS} !on
RewriteRule (.*) <a href="https://%{HTTP_HOST}%{REQUEST_URI}">https://%{HTTP_HOST}%{REQUEST_URI}</a> [L,R=301]    

Или

RewriteCond %{HTTPS} !on
RewriteCond %{SERVER_PORT} ^80$ 
RewriteCond %{HTTP:CF-Visitor} '"scheme":"http"'
RewriteRule ^(.*)$ <a href="https://%{HTTP_HOST}%{REQUEST_URI}">https://%{HTTP_HOST}%{REQUEST_URI}</a> [L,R=301]

Если же ни один из вариантов не подошел, просто укажите явно домен вместо %{HTTP_HOST}!
Не забывайте если {HTTP_HOST} в RewriteCond экранировать спец символы site\.ru

RewriteCond %{HTTPS} off
# Проверяем наличие https в URL.
RewriteRule ^(.*)$ https://site.ru/$1 [L,R=301]

Ровно по той же причине могут возникнуть проблемы с текущим редиректом WWW, в таком случае вам нужно поставить классический редирект, с явным указанием протокола.


Стандартный редирект для сайта на чистом html

Редиректsы для сайтов переведенных на чистый html

############################################################################
#### Стандартный .htaccess для HTML сайтов                      0.1     ####
############################################################################
  # 1. Удалить www
RewriteCond %{ENV:HTTPS} on
  #Если включен https
RewriteRule .* - [E=SSL:s]
  #То создаем переменную  ssl с текстом s
RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
  # Проверяем, содержит ли домен www в начале URL.
RewriteRule ^(.*)$ http%{ENV:SSL}://%1/$1 [R=301,L]
  # Перенаправляем удаляем www

  # 2. Добавить www
#RewriteCond %{ENV:HTTPS} on
  #Если включен https
#RewriteRule .* - [E=SSL:s]
  #То создаем переменную  ssl с текстом s
#RewriteCond %{HTTP_HOST} !^www\.(.*) [NC]
  # Если нет www в начале домена
#RewriteRule ^(.*)$ http%{ENV:SSL}://www.%{HTTP_HOST}/$1 [R=301,L]
  #Подставляем www и https если он включен.

############################################################################
#### Перенаправляем протокол https на http                              ####
############################################################################
#RewriteCond %{HTTPS} on
  # Проверяем наличие https в URL.
#RewriteRule ^.*$ http://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
  # Перенаправляем протокол на http.

############################################################################
#### Перенаправляем протокол http на https                              ####
############################################################################
RewriteCond %{HTTPS} off
  # Проверяем наличие https в URL.
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
  # Перенаправляем протокол на http.


############################################################################
#### Удаляем index.html из URL                                         ####
############################################################################
RewriteRule ^(.*)index\.html$ https://%{HTTP_HOST}/$1 [R=301,L]
RewriteRule ^(.*)index\.htm$ https://%{HTTP_HOST}/$1 [R=301,L]

############################################################################
#### Компрессия статического контента для гугл  спид тест               ####
############################################################################
<IfModule mod_deflate.c>
  AddType image/svg+xml .svg
  AddOutputFilterByType DEFLATE image/svg+xml  
  AddOutputFilterByType DEFLATE application/rss+xml
  AddOutputFilterByType DEFLATE application/vnd.ms-fontobject
  AddOutputFilterByType DEFLATE application/x-font
  AddOutputFilterByType DEFLATE application/x-font-opentype
  AddOutputFilterByType DEFLATE application/x-font-otf
  AddOutputFilterByType DEFLATE application/x-font-truetype
  AddOutputFilterByType DEFLATE application/x-font-ttf
  AddOutputFilterByType DEFLATE application/x-javascript
  AddOutputFilterByType DEFLATE application/xhtml+xml
  AddOutputFilterByType DEFLATE application/xml
  AddOutputFilterByType DEFLATE font/opentype
  AddOutputFilterByType DEFLATE font/otf
  AddOutputFilterByType DEFLATE font/ttf
  AddOutputFilterByType DEFLATE image/svg+xml
  AddOutputFilterByType DEFLATE image/x-icon
  AddOutputFilterByType DEFLATE text/css
  AddOutputFilterByType DEFLATE text/html
  AddOutputFilterByType DEFLATE text/javascript
  AddOutputFilterByType DEFLATE text/plain
  AddOutputFilterByType DEFLATE text/xml
  AddOutputFilterByType DEFLATE image/svg+xml
</IfModule>
<IfModule mod_expires.c>
  ExpiresActive on
  ExpiresByType image/jpeg "access plus 1 year"
  ExpiresByType image/svg "access plus 1 year"
  ExpiresByType image/gif "access plus 1 year"
  ExpiresByType image/png "access plus 1 year"
  ExpiresByType text/javascript "access plus 1 year"
  ExpiresByType text/css "access plus 1 year"
  ExpiresByType application/javascript "access plus 1 year"
  ExpiresByType application/vnd.ms-fontobject "access plus 1 year"
  ExpiresByType application/x-font-ttf "access plus 1 year"
  ExpiresByType application/x-font-opentype "access plus 1 year"
  ExpiresByType application/x-font-woff "access plus 1 year"
  ExpiresByType image/svg+xml "access plus 1 year"
</IfModule>
<IfModule mod_headers.c>
  <filesmatch "\.(ico|flv|jpg|jpeg|webp|png|gif|css|swf|woff|pdf)$">
    Header set Cache-Control "max-age=31536000, public"
  </filesmatch>
  <filesmatch "\.(html|htm)$">
    Header set Cache-Control "max-age=7200, private, must-revalidate"
  </filesmatch>
  <filesmatch "\.(pdf)$">
    Header set Cache-Control "max-age=86400, public"
  </filesmatch>
  <filesmatch "\.(js|otf|ttf|woff|woff2)$">
    Header set Cache-Control "max-age=31536000, private"
  </filesmatch>
</IfModule>
############################################################################
#### Конец общей части, далее следует собственные директивы .htaccess   ####
############################################################################

Для создания редиректов старых URL на новые, воспользуетесь стандартом по собору редиректов. Убедиться что все ссылки одают ответ 301.

Оставить комментарий

Комментарии (50)

  1. Дмитрий
    Дмитрий 24.07.2017 Ответить
    Выделите текст в серой обводке -> скопируйте его в новый текстовый документ -> сохраните -> переименуйте в ".htaccess" - > profit!
    .htaccess c чужого сайта скачать нельзя (если у жертвы правильно настроен сервер и у вас нет доступа к файловой системе).
  2. Сергей 10.08.2018 Ответить
    Мне немного непонятно, а как тогда он буде выглядеть для сайта: www.good-design.kiev.ua
  3. Виктор
    Виктор 02.12.2019 Ответить
    Абсолютно так-же, как и для любого другого домена, все изменения основаны на регулярных выражениях и не требуют изменений.
  4. Виктор 16.01.2018 Ответить
    Точка в начале файла, это скрытый файл.
  5. Никита 07.08.2017 Ответить
    Доброго дня) Использую на сайте плагин landingSeo, подробнее с ним можно познакомиться по ссылке: https://github.com/goodcode1/LandingSeo
    Для его работы в .htaccess требуется внести такие строки:
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php [L,QSA]
    Сам сайт сделан на modx revo, и он уже имеет свой набор директив в .htaccess, и выглядит он примерно таким образом:
    RewriteEngine On
    RewriteBase /
    # The Friendly URLs part
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
    Проблема в том, что сейчас приходится выбирать между корректной работой плагина или работой других ресурсов типа sitemap, robots.txt, 404 и тд.
    Интересует, есть ли возможность заставить работать и то, и то одновременно)
    Подробнее ознакомиться с проблемой можно тут: https://toster.ru/q/448942
    Мой несчастный сайт: http://helpmyapple56.ru/glavnaya.html
  6. Социопат 08.08.2017 Ответить
    Ну во-первых, вы пишете:

    | Для его работы в .htaccess требуется внести такие строки:

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

    Во-вторых, скрипт предназначен для статичных страниц и вам на Тостере это внятно прояснили, как и варианты решения проблем.

    Как вариант возможного решения: вы указываете маршрут на index.php, попробуйте указать вместо него просто адрес сайта или пустой слеш. Но вообще такое нужно смотреть и чинить, без полного кода решить наскоком не выйдет.


  7. Виктор
    Виктор 08.08.2017 Ответить
    1. скиньте весь .htaccess в ветку тостера, с кометами и тд.
    2.robots.txt - это файл а следовательно
    RewriteCond %{REQUEST_FILENAME} !-f
    должно обойти эти файлы, проблема не в этом правиле.
    3. По сути можно заменить первую часть на вторую поскольку будут урлы сохранять гет запросы но работать при этом все должно, поскольку наличие лишнего ГЕТ запроса никак не скажется на РАБОТУ сайта.
    4. После приведения всего .htacces скиньте несколько урлов списком и что они должны в конечном итоге отдавать. для полного понимания
    например
    https://site.ru/robots.txt -200 ok
    http://site.ru/url1 http:site.ru/url2
  8. Никита 09.08.2017 Ответить
    Доброго утра! Спасибо за отзывчивость!) Я дополнил свой вопрос на тостере, добавив "ответ" - https://toster.ru/q/448942
  9. Максим 06.04.2018 Ответить
    добрый день. подскажите, пожалуйста. в Вашем примере файла htaccess есть параметр отвечающий за "Убираем повторяющиеся слеши (/) в URL" - пытаюсь использовать эти строки у себя, не срабатывает. или оставляет два слеша (если они в конце) и страница открывается или выкидывает на 404. если слеши в середине пути
  10. Виктор
    Виктор 11.04.2018 Ответить
    В .htaccess последовательность правил имеет значение, скорее всего оно конфликтует с каким-то другим правилом или ЧПУ движка.
    Нужно смотреть на весь конфиг
  11. Александр 17.04.2018 Ответить
    Есть такой код:
    RewriteCond %{REQUEST_URI} !\?
    RewriteCond %{REQUEST_URI} !\&
    RewriteCond %{REQUEST_URI} !\=
    RewriteCond %{REQUEST_URI} !\.
    RewriteCond %{REQUEST_URI} !\/$
    RewriteRule ^(.*[^\/])$ /$1/ [R=301,L]

    Он перенаправляет со страница без слеша, на страницу со слешем.
    Но в url могут быть ссылки такого вида: site.ru/lang/type/name1.name2.name3
    Если убрать RewriteCond %{REQUEST_URI} !\. тогда сайт ломается. Можно как-то сделать чтобы к ссылкам подобного вида (site.ru/lang/type/name1.name2.name3) добавлялся слеш в конце и все остальные условия работали?
  12. Максим 05.05.2018 Ответить
    Добрый день, Виктор! Спасибо за ответ
    хостинг, как я понял, использует на сервере litespeed - может поэтому не срабатывает?

    вот полное содержание файла .htaccess

    # STARTNITRO
    ExpiresActive On

    #CSS JS XML TXT - 1 WEEK
    <FilesMatch "\.(xml|txt|css|js)$">
    Header set Cache-Control "max-age=604800, public"
    ExpiresDefault "access plus 1 week"
    </FilesMatch>

    #JPG JPEG PNG GIF SWF SVG - 1 WEEK
    <FilesMatch "\.(jpg|jpeg|png|gif|swf|svg|JPG|JPEG|PNG|GIF|SWF|SVG)$">
    Header set Cache-Control "max-age=604800, public"
    ExpiresDefault "access plus 1 week"
    Header set Last-Modified "Wed, 05 Jun 2009 06:40:46 GMT"
    </FilesMatch>

    #OTF WOFF TTF ICO PDF FLV - 1 WEEK
    <FilesMatch "\.(otf|ico|pdf|flv|woff|ttf)$">
    Header set Cache-Control "max-age=604800, public"
    ExpiresDefault "access plus 1 week"
    </FilesMatch>
    # ENDNITRO
    # STARTCOMPRESSNITRO
    RewriteEngine On
    RewriteRule .* - [E=HTTP_IF_MODIFIED_SINCE:%{HTTP:If-Modified-Since}]

    RewriteCond %{SCRIPT_FILENAME} !-d
    RewriteRule ^(\/?((catalog)|(assets)).+)\.css$ assets/style.php?l=4&p=$1&c=604800 [NC,L]

    RewriteCond %{SCRIPT_FILENAME} !-d
    RewriteRule ^(\/?((catalog)|(assets)).+)\.js$ assets/script.php?l=4&p=$1&c=604800 [NC,L]
    AddType image/svg+xml .svg
    AddOutputFilterByType DEFLATE image/svg+xml
    AddType application/x-font-woff .woff
    AddOutputFilterByType DEFLATE application/x-font-woff
    # ENDCOMPRESSNITRO
    # 1.To use URL Alias you need to be running apache with mod_rewrite enabled.

    # 2. In your opencart directory rename htaccess.txt to .htaccess.

    # For any support issues please visit: http://www.opencart.com

    Options +FollowSymlinks

    # Prevent Directoy listing
    Options -Indexes

    # Prevent Direct Access to files
    <FilesMatch "(?i)((\.tpl|\.ini|\.log|(?<!robots)\.txt))">
    Order deny,allow
    Deny fr om all
    </FilesMatch>

    # SEO URL Settings
    RewriteEngine On
    # If your opencart installation does not run on the main web folder make sure you folder it does run in ie. / becomes /shop/

    RewriteBase /

    # Выбор основного зеркала без www

    RewriteCond %{ENV:HTTPS} on
    RewriteRule .* - [E=SSL:s]
    RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
    RewriteRule ^(.*)$ http%{ENV:SSL}://%1/$1 [R=301,L]

    # Убираем повторяющиеся слеши (/) в URL

    RewriteCond %{THE_REQUEST} //
    RewriteRule .* /$0 [R=301,L]

    # Убираем слеши в конце URL для статических файлов (содержит точку)

    RewriteCond %{REQUEST_URI} \..+$
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} -f
    RewriteCond %{REQUEST_URI} ^(.+)/$
    RewriteRule ^(.+)/$ /$1 [R=301,L]

    # Добавляем слеш(/), если его нет, и это не файл

    RewriteCond %{REQUEST_URI} !(.*)/$
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_URI} !\..+$
    RewriteRule ^(.*)$ $1/ [L,R=301]

    # Убираем index.php, если он есть в конце URL

    RewriteCond %{REQUEST_METHOD} =GET
    RewriteCond %{REQUEST_URI} ^(.*)/index\.php$
    RewriteRule ^(.*)$ %1/ [R=301,L]

    # Компрессия статического контента для гугл спид тест

    AddType image/svg+xml .svg
    AddOutputFilterByType DEFLATE image/svg+xml
    AddOutputFilterByType DEFLATE application/rss+xml
    AddOutputFilterByType DEFLATE application/vnd.ms-fontobject
    AddOutputFilterByType DEFLATE application/x-font
    AddOutputFilterByType DEFLATE application/x-font-opentype
    AddOutputFilterByType DEFLATE application/x-font-otf
    AddOutputFilterByType DEFLATE application/x-font-truetype
    AddOutputFilterByType DEFLATE application/x-font-ttf
    AddOutputFilterByType DEFLATE application/x-javascript
    AddOutputFilterByType DEFLATE application/xhtml+xml
    AddOutputFilterByType DEFLATE application/xml
    AddOutputFilterByType DEFLATE font/opentype
    AddOutputFilterByType DEFLATE font/otf
    AddOutputFilterByType DEFLATE font/ttf
    AddOutputFilterByType DEFLATE image/svg+xml
    AddOutputFilterByType DEFLATE image/x-icon
    AddOutputFilterByType DEFLATE text/css
    AddOutputFilterByType DEFLATE text/html
    AddOutputFilterByType DEFLATE text/javascript
    AddOutputFilterByType DEFLATE text/plain
    AddOutputFilterByType DEFLATE text/xml
    AddOutputFilterByType DEFLATE image/svg+xml
    <IfModule mod_expires.c>
    ExpiresActive on
    ExpiresByType image/jpeg "access plus 3 day"
    ExpiresByType image/svg "access plus 3 day"
    ExpiresByType image/gif "access plus 3 day"
    ExpiresByType image/png "access plus 3 day"
    ExpiresByType text/javascript "access plus 3 day"
    ExpiresByType text/css "access plus 3 day"
    ExpiresByType application/javascript "access plus 3 day"
    </IfModule>

    RewriteRule ^sitemap.xml$ index.php?route=feed/google_sitemap [L]
    RewriteRule ^googlebase.xml$ index.php?route=feed/google_base [L]
    RewriteRule ^system/download/(.*) index.php?route=error/not_found [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} !.*\.(ico|gif|jpg|jpeg|png|js|css)
    RewriteRule ^([^?]*) index.php?_route_=$1 [L,QSA]

    ### Additional Settings that may need to be enabled for some servers
    ### Uncomment the commands by removing the # sign in front of it.
    ### If you get an "Internal Server Error 500" after enabling any of the following settings, restore the # as this means your host doesn't allow that.

    # 1. If your cart only allows you to add one item at a time, it is possible register_globals is on. This may work to disable it:
    # php_flag register_globals off

    # 2. If your cart has magic quotes enabled, This may work to disable it:
    # php_flag magic_quotes_gpc Off

    # 3. Set max upload file size. Most hosts will limit this and not allow it to be overridden but you can try
    # php_value upload_max_filesize 999M

    # 4. set max post size. uncomment this line if you have a lot of product options or are getting errors where forms are not saving all fields
    # php_value post_max_size 999M

    # 5. set max time script can take. uncomment this line if you have a lot of product options or are getting errors where forms are not saving all fields
    # php_value max_execution_time 200

    # 6. set max time for input to be recieved. Uncomment this line if you have a lot of product options or are getting errors wh ere forms are not saving all fields
    # php_value max_input_time 200

    # 7. disable open_basedir limitations
    # php_admin_value open_basedir none
  13. Виктор
    Виктор 14.05.2018 Ответить
    да вполне, нужно смотреть по логам.
  14. Владимир 06.07.2018 Ответить
    Здравствуйте, как мне сделать htaccess чтобы при заходе на сайт обычных людей они попадали на основной сайт к примеру google.com а определенные ip адреса перенаправлялись на example.org?
  15. Виктор
    Виктор 27.09.2018 Ответить
    Владимир
    RewriteCond %{REMOTE_ADDR} !=123.45.67.89
    RewriteRule index.php$ /construction.php [R=301,L]
  16. Андрей 07.10.2018 Ответить
    Приветствую!
    Вопрос к знающим, есть сайт на голом HTML + CSS
    Как сделать редирект категорий через .htaccess?
    Например, как в CMS движках это выглядит. Есть категория СТРОЙМАТЕРИАЛЫ
    чтобы переходя на https://site.ru/СТРОЙМАТЕРИАЛЫ.html посетители в адресной строке видели https://site.ru/СТРОЙМАТЕРИАЛЫ/
    Я не программист, только-только изучаю, нужна помощь. Помогите разобраться, а ещё луче создать полностью готовый .htaccess со всеми правилами для простого HTML сайта без WWW, с протоколом HTTPS и пятью категориями
  17. Виктор
    Виктор 08.10.2018 Ответить
    Options +FollowSymLinks
    RewriteEngine on
    RewriteCond %{REQUEST_URI} ^(.+)\.html$
    RewriteRule ^(.*)$ %1/ [R=301,L]

    RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
    RewriteRule ^(.*)$ https://%1/$1 [R=301,L]

    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [QSA,L,R=301]
  18. Дмитрий 24.04.2019 Ответить
    Доброго времени суток, спасибо за подробную инструкцию. постоянно ей пользуюсь. но сегодня столкнулся с проблемой. Не настраивается редирект с ///// на без слешей.
    код не дал результата. хотя не единожды его использовал.
    RewriteCond %{THE_REQUEST} //
    RewriteCond %{QUERY_STRING} !http(s|)://
    RewriteRule .* /$0 [R=301,L]
    подскажите в чем проблема? сайт на opencart 2.1
  19. Виктор
    Виктор 26.04.2019 Ответить
    По идее проблем быть не должно, но правила постоянно уточняются и добавляются.
    В данном месте попробуйте убавить среднюю строку и попробовать без нее, если поможет прошу сообщить сюда, а так же дайте весь свой .htaccess
    Что именно происходит, редирект не работает или цикл?
  20. Илхомжон 07.07.2019 Ответить
    Ассаламу алейкум всем пожалуйста помогите разбираться этим
    RewriteEngine on
    RewriteBase /
    Options All - Indexes
    #RewriteCond %{REQUEST_FILENAME} -s [OR]
    #RewriteCond %{REQUEST_FILENAME} -l [OR]
    #RewriteCond %{REQUEST_FILENAME} -d
    #RewriteRule ^resource/ (.*)$ resource/$1 [L]
    #RewriteRule ^.*$ [NC,L]
    RewriteRule ^.*$ index.php [NC,L]

  21. Виктор
    Виктор 16.07.2019 Ответить

    RewriteEngine on
    #включить редиректы
    RewriteBase /
    # Без директивы (.*) = /$1 будет /var/wwww/site/web/$1 с директивой = /$1
    Options All - Indexes
    # разрешить отображать файлы в каталоге если в нем нет index.php отобразится каталог
    #RewriteCond %{REQUEST_FILENAME} -s [OR]
    #Если файл 0 разммером
    #RewriteCond %{REQUEST_FILENAME} -l [OR]
    # ИЛИ это линка, не путать с И OR - это или
    #RewriteCond %{REQUEST_FILENAME} -d
    # ИЛИ это директория, не путать с И OR - это или
    #RewriteRule ^resource/ (.*)$ resource/$1 [L]
    # То выполнитьь редирект если resource пробел и что угодно в общем это неправильное правило
    #RewriteRule ^.*$ [NC,L]
    #И опять ТО, просто делает все ссылки last -совершенно бесполезное действие.
    RewriteRule ^.*$ index.php [NC,L]
    # и опять же есть ТО но нет если перенаправить на индекс пхп, притом без защиты от цикла.
    Думаю нужно было сделать так, Но вы опять же не написали что вас не устраивает.



    RewriteEngine on
    RewriteBase /
    Options All - Indexes
    # Теперь это классическое чпу, хотя
    RewriteCond %{REQUEST_FILENAME} -s
    RewriteCond %{REQUEST_FILENAME} -l
    RewriteCond %{REQUEST_FILENAME} -d
    RewriteCond %{REQUEST_FILENAME} !index\.php$
    RewriteRule ^.*$ index.php [NC,L]


    RewriteRule ^resource/(.+)$ resource/$1 [L]
    RewriteRule ^.*$ [NC,L]
  22. Андрей 26.07.2019 Ответить
    Где могут быть прописаны еще редиректы? Редиректит на :80/
  23. Виктор
    Виктор 26.07.2019 Ответить
    1.htaccess
    2. php
    3.nginx - что скорее всего
    5.apache config
  24. Андрей 27.07.2019 Ответить
    В шапке шаблона был редирект, его уже убрал.
    Что в nginx может быть?
  25. Виктор
    Виктор 31.07.2019 Ответить
    Там может быть неправильно настроен заголовок отдающийся фронт эндом, к сожалению эта ошибка в 100% магах интернета.
    Например редирет работает по алгоритму HTTP = OFF А в рефери домен выгляедт так http:site.ru:443 как следствие делаетяс редирект на https поскольку условие не проверяет порт и и протокол и редирект ведет опять на http://site.ru:443 Поскльку подмена именно протокола штатными средствами nginx не валидна Хоть и все утверждают что она работает но по факту во всех манах написана следующая схема http proxy to http https proxy to http с изменением https на yes что по сути не влияет на сам бэкэнд. Поскольку он как работал на http так и продолжает. проверьте тут ссылку и посмотрите что в цикле. https://checkmy.ru/
  26. Наталья 21.03.2020 Ответить
    А в какую часть файла ставить редиректы 301?
    типа
    Redirect 301 /(мой сайт)/ https://куда
  27. Виктор
    Виктор 23.03.2020 Ответить
    Тут ответ не такой простой как хотелось бы.
    Дело в том что .htaccess не читается один раз а перечитывается сверху вниз, постоянно до остановки генерации урлов, когда все правила сработали и больше не-было ни одного изменения.
    По этому играет роль куда и какие редиректы ставить.
    Но если говорить о среднем то правило едино
    1. вы должны включить вначале mod_rewrite - иначе редиректы не сработают
    RewriteEngine on
    его можно включить один раз в начале .htaccess
    2. Вначале ваши редиректы потом ЧПУ сайта, связано это с тем что чпу может сам поменять часть ссылки.
    Если же применительно к текущему файлу.
    ТО текущий пример вставляется над ЧПУ
    А ваши кастомные редиректы вставляются между стандартными правилами
    и ЧПУ
    то есть по середине между этими правилами и ЧПУ.
  28. Сергей 24.07.2020 Ответить
    Здравствуйте! Как избавиться от этих автоматических хвостов в коде после слеша в конце - https://rinat-akbarov.com/wordpress/shop/?sgdb33246yhgser7tjyim , потому что люди почему-то из соцсетей, где мы рекламируем сайт и страницу https://rinat-akbarov.com/wordpress/shop соцсеть (к примеру вк или фейсбук) добавляет свой хвост -?sgdb33246yhgser7tjyim и вместо нужной страницы все попадают на "ОЙ! СТРАНИЦА НЕ НАЙДЕНА"
  29. Виктор
    Виктор 27.07.2020 Ответить
    1. давайте все ховсты ;) варианты какие они есть.
    2. UTM метки вы ставите ?
    3. на сайте еть страницы с гет параметрами которые в индексе ? , если да то их пример.
  30. Роман 19.08.2020 Ответить
    Добрый день! Вставил вот этот код:
    RewriteEngine On
    RewriteBase /
    RewriteRule ^index\.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
    RewriteCond %{THE_REQUEST} //
    RewriteCond %{QUERY_STRING} !http(s|)://
    RewriteRule .* /$0 [R=301,L]
    Происходит редирект с урл: https://mysite.ru//////// на http://mysite.ru/wp-content/cache/all/index.html , а с него на https:/mysite.ru//wp-content/cache/all/index.html , который в свою очередь отдает 200 код
    Что делать?))
  31. Виктор
    Виктор 20.08.2020 Ответить
    Ну так укажите явный протокол в правиле с //
  32. Виктор
    Виктор 12.10.2020 Ответить
    Да неплохая штука но все-же часть правил упрощены, часть сделаны по другому. Так же в текущих правилах учтены особенности битрикс.
  33. Влад 16.10.2020 Ответить
    Добрый день, а можете сказать примерный путь где находиться .htacess . 1-с Битрикс. Структура сайта/файлы и папки/...?
  34. Клондайк 19.10.2020 Ответить
    это просто файл ложить его можно куда угодно, он будет действовать от текущего каталога в котором расположен
  35. Артём 24.12.2020 Ответить
    Выши правила https-редиректа отправляют http://site.ru/ на https://site.ru без концевого слеша И ДАЖЕ если добавить правило добавления слеша в конце, то оно не работает.
  36. Виктор
    Виктор 24.12.2020 Ответить
    ДА именно по этому его и нет тут.
    Слеш у домена удаляет сам браузер тут вы ничего не сделаете.
  37. Виктор
    Виктор 20.02.2021 Ответить
    да действительно я опечатался, не удаляет а добавляет
    В урле его нет но в строке браузера он есть. Вывод, все равно есть и с этим ничего не сделать.
    Мало того и нет никакого смысла его убирать.
  38. Владислав 21.01.2021 Ответить
    Доброго дня, подскажите все ли я правильно прописал? До недавнего времени находился на другом хостинге, как переехал заметил, что бросает в циклическую перезагрузку сайт, и некоторые страницы открываются с ошибкой такой страницы не существует. После того, как так просил начало работать. Если можно комментарии написать к каждому редиректу? Спасибо!
    AddDefaultCharset utf-8
    RewriteEngine on

    #редирект на HTTPS
    RewriteCond %{HTTPS} off
    RewriteCond %{HTTP:X-Forwarded-Proto} !https
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]


    RewriteCond %{REQUEST_URI} !\?
    RewriteCond %{REQUEST_URI} !\&
    RewriteCond %{REQUEST_URI} !\=
    RewriteCond %{REQUEST_URI} !\.
    RewriteCond %{REQUEST_URI} !\/$
    RewriteRule ^(.*[^\/])$ /$1/ [R=301,L]

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME}\.php -f
    RewriteRule ^(.*)/$ $1.php


    RewriteRule ^admin/$ /administration/panel/login.php [L]
    RewriteRule ^news/([A-Za-z0-9-]+)/$ /news/article.php?id=$1 [L]


    #php_value error_reporting 0
    #php_flag display_errors off
    #php_flag display_startup_errors off
    #php_flag ignore_repeated_source off
    #php_flag ignore_repeated_errors off
    #php_flag track_errors off
    #php_flag log_errors off
    #php_flag mysql.trace_mode off

    #php_value error_reporting -1
    #php_flag display_errors on
    #php_flag display_startup_errors on
    #php_flag ignore_repeated_source off
    #php_flag ignore_repeated_errors off
    #php_flag track_errors on
    #php_flag log_errors on
    #php_flag mysql.trace_mode on
  39. Владислав 21.01.2021 Ответить
    Дополню, по какой-то причине сайт не отображает в поисковой системе google прописанный description просто заголовк и все больше ничего нет.

    сайт your-service.by

    AddDefaultCharset utf-8
    RewriteEngine on

    #редирект на HTTPS
    RewriteCond %{HTTPS} off
    RewriteCond %{HTTP:X-Forwarded-Proto} !https
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]


    RewriteCond %{REQUEST_URI} !\?
    RewriteCond %{REQUEST_URI} !\&
    RewriteCond %{REQUEST_URI} !\=
    RewriteCond %{REQUEST_URI} !\.
    RewriteCond %{REQUEST_URI} !\/$
    RewriteRule ^(.*[^\/])$ /$1/ [R=301,L]

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME}\.php -f
    RewriteRule ^(.*)/$ $1.php


    RewriteRule ^admin/$ /administration/panel/login.php [L]
    RewriteRule ^news/([A-Za-z0-9-]+)/$ /news/article.php?id=$1 [L]


    #php_value error_reporting 0
    #php_flag display_errors off
    #php_flag display_startup_errors off
    #php_flag ignore_repeated_source off
    #php_flag ignore_repeated_errors off
    #php_flag track_errors off
    #php_flag log_errors off
    #php_flag mysql.trace_mode off

    #php_value error_reporting -1
    #php_flag display_errors on
    #php_flag display_startup_errors on
    #php_flag ignore_repeated_source off
    #php_flag ignore_repeated_errors off
    #php_flag track_errors on
    #php_flag log_errors on
    #php_flag mysql.trace_mode on
  40. Виктор
    Виктор 21.01.2021 Ответить

    RewriteCond %{REQUEST_URI} !\?
    RewriteCond %{REQUEST_URI} !\&
    RewriteCond %{REQUEST_URI} !\=
    RewriteCond %{REQUEST_URI} !\.
    RewriteCond %{REQUEST_URI} !\/$
    RewriteRule ^(.*[^\/])$ /$1/ [R=301,L]

    Это правило не сработает в принципе поскольку в REQUEST_URI не может быть ни ? ни & посколкьу это GET он не является частью урла.
    что вы хотели сделать этим правилом ?

    так же явно вот это не должно работать
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME}\.php -f
    RewriteRule ^(.*)/$ $1.php

    В общем напишите какие правила вы бы хотели тут видить я вам покажу что тут должно быть в реалие

    А узнать что зацикливает можно тут
    https://bertal.ru/index.php?a566754
  41. Владислав 22.01.2021 Ответить
    RewriteCond %{REQUEST_URI} !\?
    RewriteCond %{REQUEST_URI} !\&
    RewriteCond %{REQUEST_URI} !\=
    RewriteCond %{REQUEST_URI} !\.
    RewriteCond %{REQUEST_URI} !\/$
    RewriteRule ^(.*[^\/])$ /$1/ [R=301,L]

    Хотел сказать, что 301 редирект со страниц без слеша на слеш
  42. Виктор
    Виктор 27.01.2021 Ответить
    Половина из этого не может сработать поскольку эти символы в принципе не могут содержаться в REQUEST_URI.
    Теперь вопрос на засыпку.
    А вы уверены что семантически будет правильно вегда добавлять слеш ?
    Вот к примеру
    https://site.ru/logo.jpeg/
    более правильно чем
    https://site.ru/logo.jpeg

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

    ############################################################################
    #### Убираем слеши в конце URL для статических файлов (содержит точку) ####
    ############################################################################
    RewriteCond %{REQUEST_URI} \..+$
    # Если файл содержит точку.
    RewriteCond %{REQUEST_FILENAME} !-d
    # И это не директория.
    RewriteCond %{REQUEST_FILENAME} -f
    # Является файлом.
    RewriteCond %{REQUEST_URI} ^(.+)/$
    # И в конце URL есть слеш.
    RewriteRule ^(.+)/$ /$1 [R=301,L]
    # Исключить слеш.

    ############################################################################
    #### Добавляем слеш(/), если его нет, и это не файл. ####
    ############################################################################
    RewriteCond %{REQUEST_URI} !(.*)/$
    # Если слеша в конце нет.
    RewriteCond %{REQUEST_FILENAME} !-f
    # Не является файлом.
    RewriteCond %{REQUEST_URI} !\..+$
    # В URL нет точки (файл).
    RewriteCond %{REQUEST_URI} ^(.+)$
    # В URL есть хоть один символы
    RewriteRule ^(.*)$ $1/ [L,R=301]
    # Добавляем слеш в конце.
  43. Андрей 11.05.2021 Ответить
    Ну есть ещё такой момент.
    Если сайт на https , то такой редирект:

    RewriteCond %{THE_REQUEST} //
    RewriteRule .* /$0 [R=301,L]

    отправит сначала на http, а только потом на https.

    Поэтому логичнее:

    RewriteCond %{THE_REQUEST} //
    RewriteRule .* https://%{HTTP_HOST}/$0 [R=301,L]
  44. Виктор
    Виктор 13.05.2021 Ответить
    последовательность кодов не важна, но в принципе можно переделать под определение протокола как это сделано с www
  45. Виктор
    Виктор 20.09.2021 Ответить
    Страница со слешем явно ошибочная, так что серия редиректов им не помешает, как и обычным.
    Однако я протестировал у себя и такой ошибки нет, протокол сам не меняется в редиректах никогда.
    Например чтоб сделать то что вы говорите мне принудительно пришлось выяснять какй сейчас протокол и отдельно вписывать его-же в новом урле для ввв.
    #RewriteCond %{ENV:HTTPS} on
    #Если включен https
    #RewriteRule .* - [E=SSL:s]
    #То создаем переменную ssl с текстом s
    #RewriteCond %{HTTP_HOST} !^www\.(.*) [NC]
    # Если нет www в начале домена
    #RewriteRule ^(.*)$ http%{ENV:SSL}://www.%{HTTP_HOST}/$1 [R=301,L]
    #Подставляем www и https если он включен.
    вот тут, обратите внимание другим способом за протокол не уцепитья.
    Так же я проверил собственно на самом сайте студии
    http://klondike-studio.ru//
    как видите все работает 301+200

Оставить комментарий