Чисто памятка для универсального .htaccess для всех редиректов сразу — http на https, www на без www, со слешем, без слеша, с поддоменов одного домена на поддомены другого и т.д.
Используется на на сайтах на Битриксе, в целом, должен работать и на любых других.
Options -Indexes ErrorDocument 404 /404.php RewriteEngine On RewriteCond %{SERVER_PORT} 80 RewriteRule ^(.*)$ https://site.ru/$1 [R=301,L] #ROBOTS.TXT RewriteCond %{HTTPS} off RewriteCond %{HTTP:X-Forwarded-Proto} !https RewriteCond %{REQUEST_URI} !robots.txt RewriteRule ^(.*)$ https://site.ru/$1 [R=301,L] #DOMAIN AND SUBDOMAIN REDIRECTION RewriteBase / RewriteCond %{HTTP_HOST} !^(www\.)?old-site\.ru$ RewriteCond %{HTTP_HOST} ^(.+)\.old-site\.ru$ RewriteRule (.*) https://%1.new-site.ru/$1 [R=301,L] RewriteCond %{HTTP_HOST} ^old-site.ru$ [NC] RewriteRule ^(.*)$ https://new-site.ru/$1 [R=301,L] RewriteCond %{SERVER_PORT} !^443$ RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [L,R=301] #one-to-301-wo-www-and-slash RewriteCond %{REQUEST_URI} !\? RewriteCond %{REQUEST_URI} !\& RewriteCond %{REQUEST_URI} !\= RewriteCond %{REQUEST_URI} !\. RewriteCond %{REQUEST_URI} !\/$ RewriteCond %{HTTP_HOST} ^www\.(.*)$ RewriteRule ^(.*)$ https://%1/$1/ [L,R=301] RewriteCond %{REQUEST_URI} !\? RewriteCond %{REQUEST_URI} !\& RewriteCond %{REQUEST_URI} !\= RewriteCond %{REQUEST_URI} !\. RewriteCond %{REQUEST_URI} ![^\/]$ RewriteCond %{HTTP_HOST} ^www\.(.*)$ RewriteRule ^(.*)$ https://%1/$1 [L,R=301] RewriteCond %{REQUEST_URI} !\? RewriteCond %{REQUEST_URI} !\& RewriteCond %{REQUEST_URI} !\= RewriteCond %{REQUEST_URI} !\. RewriteCond %{REQUEST_URI} !\/$ RewriteCond %{HTTP_HOST} ^([^www].*)$ RewriteRule ^(.*)$ https://%1/$1/ [L,R=301] RewriteCond %{REQUEST_URI} !\& RewriteCond %{REQUEST_URI} !\= RewriteCond %{REQUEST_URI} !\. RewriteCond %{REQUEST_URI} !\/$ RewriteCond %{HTTP_HOST} ^([^www].*)$ RewriteRule ^(.*)$ https://%1/$1/ [L,R=301] #RewriteCond %{HTTPS} =off #RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [QSA,L] php_flag session.use_trans_sid off #php_flag default_charset UTF-8 #php_value display_errors 1 php_flag session.use_trans_sid off php_flag default_charset UTF-8 #php_value display_errors 1 Options +FollowSymLinks RewriteEngine On 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}] DirectoryIndex index.php index.html ExpiresActive on ExpiresByType image/jpeg "access plus 3 day" ExpiresByType image/gif "access plus 3 day" ExpiresByType image/png "access plus 3 day" ExpiresByType text/css "access plus 3 day" ExpiresByType application/javascript "access plus 3 day"
Убрать index.php (при .html — заменить .php в записи) в конце адреса
# remove index.php from the end of URI RewriteEngine On RewriteRule ^index\.php$ / [R=301,L] RewriteRule ^(.*)/index\.php$ /$1/ [R=301,L]
Редирект GET параметров
Например, сделать редирект со страницы /?act=page&id=2 на /page-2/
RewriteCond %{QUERY_STRING} act=page [NC] RewriteCond %{QUERY_STRING} id=(\d+) [NC] RewriteRule .* /page/%1/? [R=301,L]]
Как убрать все get запросы htaccess redirect
RewriteRule ^(.*)$ /$1? [R=301,L]
Настройка таких редиректов бывает необходимо после заражения сайта вирусами, когда идет очень много обращений к страницам файла с GET запросами.
Однако если административная панель сайта использует GET запросы, необходимо исключить из этой конструкции папку административной панели сайта, и переделать ее в следующий вид:
RewriteCond %{REQUEST_URI} !^/admin/
RewriteCond %{QUERY_STRING} ^(.+) [NC]
RewriteRule ^(.*)$ /$1? [R=301,L]