В каждой CMS системе есть свои особенности, свои плюсы и минусы. В 1C-Bitrix, также есть куча своих нюансов, об одном из них расскажу.
Избавляемся от дублей в Битрикс
Речь идет про Apache, или Apache/Nginx, и работу через файл htaccess. Бывают разные ситуации, когда не все редиректы отрабатывают или «ложится» админка и т.д. Здесь рассмотрен пример в котором ВСЕ работает (или пока что работает 🙂 ).
Какие дубли убираем
- дубли слеша на конце урлов — принудительно добавляем
- дубли главного зеркала — принудительно на non-www
- дубли с /index.php при просмотре с главной
- дубли с /index.php при попытке открыть такой урл с внутренних страниц. Например site.com/index.php/services/qa
- дубли вида site.com/alias/index.php
- дубли .html в конце урла — принудительно «отрезаем»
Собственно сам htaccess
< IfModule mod_rewrite.c >
Options +FollowSymLinks
RewriteEngine On
#добавляет слэш в конец
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*[^/])$ $1/ [L,R=301]
#редирект на без www
RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
#редирект с /index.php
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/
RewriteRule ^index\.php$ http://site.com/ [R=301,L]
#редирект с внутренних /index.php
RewriteCond %{REQUEST_URI} ^/index.php/(.*)$
RewriteRule (index.php)/(.*) http://site.com/$2 [R=permanent,L]
#убирает .html со всех урлов
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+([^.]+)\.html [NC]
RewriteRule ^ /%1/ [R=301,L]
#убирает /index.php в конце алиаса
RewriteRule ^(.*)index\.php$ $1 [R=301,L]
#стандартный набор Битрикс
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !/bitrix/urlrewrite.php$
RewriteRule ^(.*)$ /bitrix/urlrewrite.php [L]
RewriteRule .* — [E=REMOTE_USER:%{HTTP:Authorization}]
< / IfModule >
Использовать нужно только так (в таком порядке) как тут написано!
Это все дело обернуто в стандартную конструкцию «IfModule» — по умолчанию.
Схожая статья — основные редиректы, с чего начать?
И напоследок — небольшой совет ↓
Если Вы не очень поняли, что написано выше, или самостоятельно не получается избавится от дублей в Битрикс — не переживайте!
Вам поможет простой и удобный инструмент для управления редиректами в Битрикс, рекомендую установить модуль Редирект Мастер.
В нем можно удобно:
- создать редиректы через админку,
- загрузить их из Excel,
- сгенерировать редиректы при изменения ЧПУ,
- настроить их автоматическое создание.
Более полый перечень функций можно посмотреть на официальном сайте разработчика: atlant2010.ru
Модуль доступен в Маркетплейс 1С-Битрикс.
#редирект с внутренних /index.php
не работает
происходит редирект на
site.com/vnetrenya/index.php/
Все должно работать, возможно где-то допустили ошибку, перепроверьте еще раз. Как вариант, можно пробовать менять местами регулярки, например, сначала выполнить редирект с index.php, а после (ниже) — выполнять редирект слэша..
Max, хорошие рекомендации, спасибо.
Для полного счастья было бы неплохо исправить пару ошибок, неочевидных — и потому неприятных, особенно тем, кто сделал простой copy/paste
1) #убирает /index.php в конце алиаса
RewriteRule ^(.*)index\.php$ $1 [R=301,L]
я бы записал эту строку так (перед index добавил /)
RewriteRule ^(.*)/index\.php$ $1 [R=301,L]
2) в строке
RewriteRule .* — [E=REMOTE_USER:%{HTTP:Authorization}]
очень уж подозрительный дефис, лучше перебить его обычным символом «минус»
RewriteRule .* — [E=REMOTE_USER:%{HTTP:Authorization}]
Спасибо за рекомендации, Сергей! Возможно это правильнее, но я делал так, как написано, и у меня все отрабатывало 🙂
Max, не сомневаюсь, что отработает. До первых «граблей» в виде url, содержащего фразу index.php, как часть имени скрипта типа search_reindex.php. В итоге получим проблему, например в админке:
— так должно быть
site.my/bitrix/admin/search_reindex.php/?lang=ru
— так получится, фраза index.php честно вырезана из url
site.my/bitrix/admin/search_re/?lang=ru
К чему это приведет — догадаться несложно.
В качестве альтернативы можно отменить действие всех правил редиректа для админки битрикс, но это еще пара дополнительных строк в .htaccess.
1) все равно не отрабатывает правильно, нужно писать исключение:
RewriteCond %{REQUEST_URI} !^/bitrix/
или любой другой на ваше усмотрение
вдогонку…
хотя, судя по моему предыдущему опубликованному комментарию, по поводу дефиса — это проблемы сайта, при публикации обычный «минус» меняется на нечто похожее, с кодом #x97
А как сделать редирект на www?
Чтобы был адрес вида https://www.site.ru, даже если набирают адрес без ввв и без хттпС
(переход на httpS осуществлен)
Попробуйте в начале (до https правил) добавить это:
Options +FollowSymLinks
RewriteEngine On
RewriteCond %{HTTP_HOST} ^domain\.com$ [NC]
RewriteRule ^(.*)$ http://www.domain.com/$1 [R=301,L]
проверьте через bertal все варианты с ввв, без, индекс пхп и т.д., если что-то легло, то попробуйте перенести регулярку
RewriteCond %{HTTP_HOST} ^domain\.com$ [NC]
RewriteRule ^(.*)$ http://www.domain.com/$1 [R=301,L]
после правил https
p.s. и не забудьте проверить админку после всех манипуляций
тут больше написано — http://max-levsha.by/bazovye-nastrojki-htaccess/
Хорошие рекомендации, буду использовать.
Спасибо за статью. Помогла.
Хочу купить htaccess bitrix