Редиректы htaccess, php, для разных задач
Разные примеры - редиректов.
301 редирект - одно из средств перенаправления с одного url адреса на другой.
301 редирект - это постоянное перенаправление, его используют для склейки url адресов, например если у материала поменялся адрес, либо у данной страницы есть полный её дубль.
Часто используемые редиректы
index.php
Во многих CMS всегда присутствует полный дубль любой страницы с /index.php. Это нормально и Joomla, в данном случае, не исключение
Для того, что бы убрать index.php из url адресов, воспользуемся следующей конструкцией:
Redirect 301 /index.php http://site.ru/
или
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/
RewriteRule ^index\.php$ http://site.ru/ [R=301,L]
Использую вот такой вариант, т.к. он не требует вписывания домена, ведь сайт домен может и поменять! Так же это работает для корневых директорий - разделов.
RewriteBase /
RewriteRule ^(.*)index\.php$ $1 [R=301,L]
Склейка доменов
Все прилинкованные домены ведут на основной:
RewriteCond %{HTTP_HOST} !^site.ru$
RewriteRule ^(.*) http://site.ru/$1 [R=301,L]
Редирект с .html на без .html
RewriteBase / RewriteRule (.*)\.html$ $1 [R=301,L]
или
REDIRECTMATCH 301 (.*)\.html$ http://site.ru$1
ИЛИ развернутый с joomlashack.com
RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} \.html$ RewriteRule ^(.*)\.html$ /$1 [R,L]
Редирект при смене структуры разделов
Например поменяли структуру сайта и нужно сделать так, чтобы все страницы бывшего раздела перенаправлялись на те же страницы, но только нового.
Допустим было: site.com/blog/raznoe/article на site.com/blog/article
RewriteRule ^blog/raznoe/(.*)$ http://site.ru/blog/$1 [R=permanent,L]
Комплексный вариант:
RewriteEngine on
RewriteCond %{HTTP_HOST} ^domain.com.ua$ [OR]
RewriteCond %{HTTP_HOST} ^www.domain.com.ua$ [OR]
RewriteCond %{HTTP_HOST} ^www.domain.com$
RewriteRule ^(.*)$ http://domain.com/$1 [R=301,L]
Редирект на без .php на статичном сайте
Был статичный сайт - просто php файлики в разных директориях (папках), но уже успел проиндексироваться. Встала такая задача: сделать редирект с index.php
в корне и у основных разделов (папок), убрать .php
у страниц (файлов), и сделать редирект со старых страничек с .php
. Т.е. скрыть везде расширения файлов и индексные страницы с редиректом.
После многочисленных проб и ошибок получился вот такой вариант:
RewriteEngine On
# редирект c index.php в любой директории
RewriteBase /
RewriteRule ^(.*)index\.php$ $1 [R=301,L]
# редирект всего и все что содержит .php
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^(.+)\.php$ /$1 [R=301,L]
# показывать любые страницы без .php
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php
Редиректы в PHP на без index.php и без www
Бывает, что нет доступа или не удобно воспользоваться .htaccess для настройки редиректа, но можно это сделать через PHP.
Пригодилось это только один раз, когда не хватало прав на изменение .htaccess, а других вариантов не было прямо щас.
PHP редирект с Index.php
if($_SERVER['REQUEST_URI'] == "/index.php") {
header("Location: /",TRUE,301);
exit();
}
С WWW и наоборот:
<?php
# Если пользователь набрать домен без www
if (!preg_match( '|^www\..*|', $_SERVER [ 'HTTP_HOST' ])) { # переадресовываем на домен с www
header ( 'HTTP/1.0 301 Moved Permanently' );
$url = trim ($_SERVER [ 'REQUEST_URI' ], '/');
if(trim($_SERVER [ 'REQUEST_URI' ], '/') != '') $url .= '/';
header('Location: http://www.сайт.ru/' . $url);
die();
}
?>
<?php
# Если пользователь набрал домен с www
if (preg_match( '|^www\..*|', $_SERVER [ 'HTTP_HOST' ])) { # переадресовываем на домен без www
header ( 'HTTP/1.0 301 Moved Permanently' );
$url = trim ($_SERVER [ 'REQUEST_URI' ], '/');
if(trim($_SERVER [ 'REQUEST_URI' ], '/') != '') $url .= '/';
header('Location: http://promostart.ru/'. $url);
die();
}
?>
Варианты с WWW даже не попробовал.