Войти

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

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

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

  • Установить основное зеркало сайта с www  сохраняя протокол  http или https (новое)
  • Установка основного зеркала сайта без www сохраняя http или https (новое)
  • Удалить любое количество "/" стоящих рядом; site.ru////catalog//item  > site.ru/catalog/item
  • HTTP > HTTPS 
  • HTTPS > HTTP
  • Удалять "/" в конце 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. При установке HTTPS основным зеркалом,  перейти на свой сайт и убедиться в отсутствие  blocked:mixed

Проверить работу redirect
Сервис по генерации списка redirect

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

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

  RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]    
Или
RewriteCond %{HTTPS} !on
RewriteCond %{SERVER_PORT} ^80$ 
RewriteCond %{HTTP:CF-Visitor} '"scheme":"http"'
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
В ряде случаев может помочь указание конкретного хоста.
RewriteCond %{HTTPS} !on
   # Проверяем наличие https в URL.
RewriteRule ^(.*)$ https://site.ru/$1 [L,R=301]
Ровно по той же причине могут возникнуть проблемы с текущим редиректом WWW, в таком случае вам нужно поставить классический редирект, с явным указанием протокола.

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

############################################################################
#### Стандартный .htaccess для проектов студии Клондайк, версия 4.2     ####
############################################################################
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} !on
   # Проверяем наличие https в URL.
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
   # Перенаправляем протокол на http.

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

############################################################################
#### Убираем повторяющиеся слеши (/) в URL                              ####
############################################################################
RewriteCond %{THE_REQUEST} //
   # Проверяем, повторяется ли слеш (//) более двух раз.
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 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>
############################################################################
#### Антивирус, только для 1С-Битрикс,                                  ####
############################################################################
#php_value auto_prepend_file "/home/bitrix/ext_www/SITE.RU/bitrix/modules/security/tools/start.php"
   #  если у вас FastCGI, директив не сработает, и нужно ее записать в vhost
   #  укажите путь до файла 
   # включить тут /bitrix/admin/security_antivirus.php?lang=ru

############################################################################
#### Конец общей части, далее следует собственные директивы .htaccess   ####
############################################################################
# Рефакторинг сайта 01.01.18



############################################################################
#### Конец собственных директив                             .htaccess   ####
############################################################################


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

  1. Дмитрий
    Дмитрий 24.07.2017 Ответить
    Выделите текст в серой обводке -> скопируйте его в новый текстовый документ -> сохраните -> переименуйте в ".htaccess" - > profit!
    .htaccess c чужого сайта скачать нельзя (если у жертвы правильно настроен сервер и у вас нет доступа к файловой системе).
  2. Сергей 10.08.2018 Ответить
    Мне немного непонятно, а как тогда он буде выглядеть для сайта: www.good-design.kiev.ua
  3. Виктор 16.01.2018 Ответить
    Точка в начале файла, это скрытый файл.
  4. Никита 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
  5. Социопат 08.08.2017 Ответить
    Ну во-первых, вы пишете:

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

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

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

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


  6. Виктор
    Виктор 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
  7. Никита 09.08.2017 Ответить
    Доброго утра! Спасибо за отзывчивость!) Я дополнил свой вопрос на тостере, добавив "ответ" - https://toster.ru/q/448942
  8. Максим 06.04.2018 Ответить
    добрый день. подскажите, пожалуйста. в Вашем примере файла htaccess есть параметр отвечающий за "Убираем повторяющиеся слеши (/) в URL" - пытаюсь использовать эти строки у себя, не срабатывает. или оставляет два слеша (если они в конце) и страница открывается или выкидывает на 404. если слеши в середине пути
  9. Виктор
    Виктор 11.04.2018 Ответить
    В .htaccess последовательность правил имеет значение, скорее всего оно конфликтует с каким-то другим правилом или ЧПУ движка.
    Нужно смотреть на весь конфиг
  10. Максим 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
  11. Виктор
    Виктор 14.05.2018 Ответить
    да вполне, нужно смотреть по логам.
  12. Владимир 06.07.2018 Ответить
    Здравствуйте, как мне сделать htaccess чтобы при заходе на сайт обычных людей они попадали на основной сайт к примеру google.com а определенные ip адреса перенаправлялись на example.org?
  13. Виктор
    Виктор 27.09.2018 Ответить
    Владимир
    RewriteCond %{REMOTE_ADDR} !=123.45.67.89
    RewriteRule index.php$ /construction.php [R=301,L]
  14. Андрей 07.10.2018 Ответить
    Приветствую!
    Вопрос к знающим, есть сайт на голом HTML + CSS
    Как сделать редирект категорий через .htaccess?
    Например, как в CMS движках это выглядит. Есть категория СТРОЙМАТЕРИАЛЫ
    чтобы переходя на https://site.ru/СТРОЙМАТЕРИАЛЫ.html посетители в адресной строке видели https://site.ru/СТРОЙМАТЕРИАЛЫ/
    Я не программист, только-только изучаю, нужна помощь. Помогите разобраться, а ещё луче создать полностью готовый .htaccess со всеми правилами для простого HTML сайта без WWW, с протоколом HTTPS и пятью категориями
  15. Виктор
    Виктор 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]

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