Правила htaccess на все случаи жизни
При создании сайтов мы часто сталкиваемся с задачами SEO оптимизации, такими как — 301 редиректы, необходимостью убрать www в адресе или наоборот добавить www в адрес, при этом не сломав индексацию сайта. И многие другие примеры, в которых нам поможет настройка htaccess файла.
Несколько советов перед тем, как перейдем к разбору правил htaccess
- Первым делом идут более частные переадресации (например, ели у статьи сменился адрес и нужно указать поисковику на это), затем более глобальные (с www на без www).
- Избегайте множественных переадресаций, это пагубно влияет как на время загрузки сайта, так и на индексацию. С недавних пор поисковики начали смотреть и на этот фактор.
- После вставки правил в htaccess — ваш браузер может кэшировать прошлое, поэтому сбрасывайте его либо пользуйтесь сторонними сервисами для проверки переадресаций.
Правила переадресаций
1. 301 редирект с одной страницы на другую
Иногда нам необходимо указать поисковой системе о сменившемся url страницы, делается это так:
1 | Redirect 301 /test1/ http://exemple.com/test2/ |
С регулярными выражениями:
1 2 | RewriteCond %{REQUEST_URI} ^/test/$ RewriteRule ^.*$ http://example.com/test2/? [R=301,L] |
2. 301 редирект с без www на www (главное зеркало – домен с www)
1 2 | RewriteCond %{HTTP_HOST} ^([^www].*)$ RewriteRule ^(.*)$ http://www.%1/$1 [L,R=301] |
3. 301 редирект с www на без www (главное зеркало – домен без www)
1 2 | RewriteCond %{HTTP_HOST} ^www\.(.*)$ RewriteRule ^(.*)$ http://%1/$1 [L,R=301] |
4. Убираем слэш в конце url через 301 редирект
1 2 3 4 5 6 | RewriteCond %{REQUEST_URI} !\? RewriteCond %{REQUEST_URI} !\& RewriteCond %{REQUEST_URI} !\= RewriteCond %{REQUEST_URI} !\. RewriteCond %{REQUEST_URI} ![^\/]$ RewriteRule ^(.*)\/$ /$1 [R=301,L] |
5. Добавляем слэш в конце url через 301 редирект (часто в CMS системах устанавливается автоматически)
1 2 3 4 5 6 | RewriteCond %{REQUEST_URI} !\? RewriteCond %{REQUEST_URI} !\& RewriteCond %{REQUEST_URI} !\= RewriteCond %{REQUEST_URI} !\. RewriteCond %{REQUEST_URI} !\/$ RewriteRule ^(.*[^\/])$ /$1/ [R=301,L] |
6. Один 301 редирект на без www и с слешем на конце адреса страницы.
Полезно, чтобы не создавать 2 редиректа
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | RewriteCond %{REQUEST_URI} !\? RewriteCond %{REQUEST_URI} !\& RewriteCond %{REQUEST_URI} !\= RewriteCond %{REQUEST_URI} !\. RewriteCond %{REQUEST_URI} !\/$ RewriteCond %{HTTP_HOST} ^www\.(.*)$ RewriteRule ^(.*)$ http://%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 ^(.*)$ http://%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 ^(.*)$ http://%1/$1/ [L,R=301] |
7. Один 301 редирект на c www и со слешем на конце адреса страницы
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | RewriteCond %{REQUEST_URI} !\? RewriteCond %{REQUEST_URI} !\& RewriteCond %{REQUEST_URI} !\= RewriteCond %{REQUEST_URI} !\. RewriteCond %{REQUEST_URI} !\/$ RewriteCond %{HTTP_HOST} ^www\.(.*)$ RewriteRule ^(.*)$ http://www.%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 ^(.*)$ http://www.%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 ^(.*)$ http://www.%1/$1 [L,R=301] |
8. Один 301 редирект на c www и без слеша на конце адреса страницы
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | RewriteCond %{REQUEST_URI} ^\/$ RewriteCond %{HTTP_HOST} ^([^www].*)$ RewriteRule ^(.*)$ http://www.%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 ^(.*)\/$ http://www.%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 ^(.*)$ http://www.%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 ^(.*)\/$ http://www.%1/$1 [L,R=301] |
9. Один 301 редирект на без www и без слеша на конце адреса страницы
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | RewriteCond %{REQUEST_URI} ^\/$ RewriteCond %{HTTP_HOST} ^www\.(.*)$ RewriteRule ^(.*)$ http://%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 ^(.*)\/$ http://%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 ^(.*)$ http://%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 ^(.*)\/$ http://%1/$1 [L,R=301] |
10. 301 редирект только адреса site.ru/index.php (без GET параметров) на основное зеркало site.ru
1 2 3 | RewriteCond %{REQUEST_URI} /index.php RewriteCond %{QUERY_STRING} ^\z RewriteRule ^(.*)$ http://site.ru/? [R=301,L] |
11. 301 редирект всех адресов с index.php и GET параметрами на страницы только с GET параметрами (вырезать в url index.php)
Пример: типа site.ru/index.php?n=1 на site.ru/?n=1
1 2 | RewriteCond %{REQUEST_URI} /index.php RewriteRule ^(.*)$ http://site.ru/ [R=301,L] |
12. 301 редирект url с GET параметрами (динамический URL) на статический
1 вариант (простой адрес с GET параметром)
1 2 | RewriteCond %{QUERY_STRING} ^id=777 RewriteRule ^.*$ /newurl/? [R=301,L] |
2 вариант (со страницы и GET параметром)
1 2 3 | RewriteCond %{REQUEST_URI} /test/ RewriteCond %{QUERY_STRING} ^id=777 RewriteRule ^.*$ /newurl/? [R=301,L] |
13. Все страницы одного домена на главную страницу другого домена
1 2 | RewriteCond %{REQUEST_URI} (.*) RewriteRule ^(.*)$ http://site.ru/ [L,R=301] |
14. Каждая страница одного домена на такой же адрес другого url
1 2 | RewriteCond %{REQUEST_URI} (.*) RewriteRule ^(.*)$ http://site.ru/$1 [L,R=301] |
15. С алиаса на основной домен
1 2 3 | RewriteCond %{HTTP_HOST} ^site.ru$ [NC] RewriteCond %{REQUEST_URI} (.*) RewriteRule ^(.*)$ http://site2.ru/ [L,R=301] |
16. Каждая страницы алиаса на такой же адрес основного сайта
1 2 3 | RewriteCond %{HTTP_HOST} ^site.ru$ [NC] RewriteCond %{REQUEST_URI} (.*) RewriteRule ^(.*)$ http://site2.ru/$1 [L,R=301] |
17. Редирект с протокола http на https.
1 2 | RewriteCond %{HTTPS} !=on RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L] |
Обратный редирект. Исключаем использование защищенного протокола не отключая его физически на хостинге.
18. Редирект протокола https на http.
1 2 | RewriteCond %{HTTPS} =on RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [R=301,L] |