Редиректы 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' ])) { # переадресовываем на домен&nbsp;без 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 даже не попробовал.

Ссылки и благодарности

Взято с разных источников, в основном из этой темы JoomlaForum.

Спасибо пользователю ELLE.