301 редиректы через .htaccess
# Самый простой вариант
Redirect 301 /test-1/ https://site.ru/test-2/
# 301 редирект с www на без www (главное зеркало – домен без www)
RewriteCond %{HTTP_HOST} ^www\.(.*)$
RewriteRule ^(.*)$ https://%1/$1 [L,R=301]
# 301 редирект с без www на www (главное зеркало – домен с www)
RewriteCond %{HTTP_HOST} ^([^www].*)$
RewriteRule ^(.*)$ https://www.%1/$1 [L,R=301]
# 301 редирект со страниц со слешем на без слеша (весь сайт)
RewriteCond %{REQUEST_URI} !\?
RewriteCond %{REQUEST_URI} !\&
RewriteCond %{REQUEST_URI} !\=
RewriteCond %{REQUEST_URI} !\.
RewriteCond %{REQUEST_URI} ![^\/]$
RewriteRule ^(.*)\/$ https://site.ru/$1 [R=301,L]
# 301 редирект со страниц без слеша на слеш (часто в CMS системах устанавливается автоматически)
RewriteCond %{REQUEST_URI} !\?
RewriteCond %{REQUEST_URI} !\&
RewriteCond %{REQUEST_URI} !\=
RewriteCond %{REQUEST_URI} !\.
RewriteCond %{REQUEST_URI} !\/$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^/wp-json/
RewriteRule ^(.*[^\/])$ https://site.ru/$1/ [R=301,L]
# Все страницы одного домена на главную страницу другого домена
RewriteCond %{REQUEST_URI} (.*)
RewriteRule ^(.*)$ https://site.ru/ [L,R=301]
# Каждая страница одного домена на такой же адрес другого url
RewriteCond %{REQUEST_URI} (.*)
RewriteRule ^(.*)$ https://site.ru/$1 [L,R=301]
# Каждая страница одного домена на такой же адрес другого url, кроме robots.txt
RewriteCond %{REQUEST_URI} !^/robots.txt$
RewriteRule ^(.*)$ https://site.ru/$1 [L,R=301]
# Редирект с протокола http на https.
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
Если возникает циклический редирект, то воспользуйтесь этим вариантом:
RewriteCond %{HTTPS} off
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Для Битрикс-сайтов на хостинге reg.ru
RewriteCond %{SERVER_PORT} !^443$
RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
Для сертификатов https c Cloudflare:
RewriteCond %{HTTP:CF-Visitor} '"scheme":"http"'
# Without Cloudflare:
# RewriteCond %{HTTPS} off
RewriteRule ^ https://www.example.com%{REQUEST_URI} [NE,R=301,L]
Если используется Cloudflare - в настройках SSL/TLS нужно выключить опции Always Use HTTPS и Automatic HTTPS Rewrites чтобы не было 307 редиректа.
# Убираем знак вопроса в конце URL (/?)
RewriteCond %{THE_REQUEST} ^[^\s]+\s+[^?]*?\?
RewriteCond %{QUERY_STRING} ^$
RewriteRule .? https://site.ru%{REQUEST_URI}? [R=301,L]
# Удаление повторяющихся слешей ////
RewriteCond %{THE_REQUEST} //
RewriteRule .* https://site.ru/$0 [R=301,L]
# Редирект с /index.php на /
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+index\.php\s [NC]
RewriteRule ^index\.php$ https://site.ru/ [R=301,L]
Сервис для проверки редиректов: https://be1.ru/dubli-stranic/
Сервис для проверки HSTS: https://page-speed.ru/tools/http2/
Источники:
https://web-optimizator.com/301-redirekt-htaccess/
https://libramedia.ru/blog/redirekt-so-znaka-voprosa-v-konce-url/
https://snipp.ru/htaccess/redirects-htaccess