Как в PHP задать редирект на другой URL до загрузки страницы? Дешевый redirect php.

Несколько недель назад по некой нужде было необходимо добавить форум в только что написанный сайт. Сайт на этапе завершения, пользователей раз-два и обчелся. Сайт был написан на Codeigniter. В качестве форума был выбран phpBB, как один из распространенных free форум версии 3.1.1 . После несложных манипуляций форум без проблем был установлен. Стало интереснее, когда дело дошло до пользователей.

Первым делом я решил поискать готовые решение дабы не тратить ни свое время, ни время клиента. Была найдена уже не рабочая ссылка на библиотеку phpBB3_library, были найдены плагины для WP, и др. движков, но мне хотелось сделать интеграцию безболезненно для себя и моего детища (сайта) и форума.

Недолго погуглив, нашел вот эту , с которой и началось мое погружение в глубины пользовательской функциональности phpBB.

Постановка задачи
  • Сделать безболезненную интеграцию. Должен быть один реализующий класс. Без изменений в движке форума, дабы при обновлении форума ничего не слетело.
  • Максимальное использование функций форума в нашем классе. Городить велосипед не хочется.
  • Реализовать совместную регистрацию, смену пароля, авторизацию, конец сеанса, блокировку и отмену блокировки пользователя на основе уже существующего функционала форума.
  • Анализ После чтения доков, стало понятно, что функции управления пользователями размещаются в /includes/functions_user.php, а авторизация в /phpbb/auth/provider. В этой папке размещены функции для нескольких вариантов авторизации. Тип авторизации задается в панели администрирования форума, раздел «Общие -> Аутентификация». Я поставил значение по умолчанию - Db.

    В принципе, необходимый функционал я нашел в этих двух файла, кроме обновления данных пользователя. Далее приступаем к реализации.

    Начальные данные
  • Сайт, реализованный с помощью codeigniter.
  • Форум phpBB.
  • Таблица с пользователями сайта - USERS.
  • Таблица с пользователями форума - phpbb_USERS.
  • Регистрация/авторизация пользователей на сайте - переделанная под свои нужды библиотека Codeigniter Auth .
  • Решение Задача поставлена, надо делать.

    Перед началом - несколько нюансов.

  • Необходимо отключить регистрацию пользователей на сайте. Это делается в панели администратора (Общие -> регистрация пользователей -> Разрешить смену имени пользователя -> Нет). Разрешаем пользователю регистрацию только на сайте.
  • Запрещаем смену имени пользователя (Общие -> Регистрация пользователей -> Активация аккаунта -> Отключено).
  • Запрещаем авторизацию с форума. Авторизацию и выход делаем только с сайта. Сделал «в лоб» - в файле /ucp.php сделал редиректы на соответствующие страницы на сайте. (см. строки «case "login":», «case "login_link":», «case "logout":». Редирект «header("Location: /auth/login");» и «header("Location: /auth/logout");»).
  • На сайте (если есть функция redirect()) заменить функцию redirect(), например на ciredirect(), дабы избежать конфликта имен - в phpBB есть функция с аналогичным названием.
  • Для codeigniter создаю библиотеку my_phplib.php (библиотека в codeigniter - это некий вспомогательный, подключаемый класс, располагающийся в папке application/libraries. В нем нет ничего необычного, так что пользователи других движков/фрейморков - не унывайте).

    Итак, содержимое библиотеки:

    Библиотека my_phplib.php

    В другом файле помещаем строку:

    echo "Привет! Вы находитесь в файле redirect2.php";

    Еще несколько практических примеров использования редиректа на php :

    • Принудительная передача кода состояния http – при использовании первого аргумента функции header() типа «location » по умолчанию в заголовок передается код состояния «302 » (временно перемещен ). Это может стать проблемой при переносе ресурса на другое доменное имя. В поисковиках такое временное перенаправление может затянуться. Ведь поисковик постоянно анализирует код состояния. А в нем записано «временно перемещен ». Пример принудительной перезаписи кода состояния «302 » на «301 » (постоянно перемещен ):

    Также перезапись возможна в два этапа. Первая строка производит перезапись кода состояния, а вторая перенаправляет на новый адрес.

    С переадресацией (она же - «редирект») сталкивался каждый пользователь интернета. Достаточно просто выбрать в поисковой системе любой сайт из выдачи и поисковая система автоматически перенаправит Вас на сайт. В этой статье мы расскажем о том, какие виды переадресации существуют и как их настроить.

    Основные операторы регулярных выражений

    Для начала давайте разберемся с основными операторами регулярных выражений (флаги, модификаторы, специальные символы):

    Спецсимволы:

    • ^ — ограничение слева (начало строки);
    • $ — ограничение справа (конец строки);
    • . — любой символ;
    • () — переменная;
    • \ — экранирование (символ после \ считается обычным, а не спецсимволом);
    • — диапазон значений;
    • ! — спецсимвол отрицания.

    Модификаторы:

    • ? — символ повторяется 0 или 1 раз;
    • + — 1 и более символов (до 65536);
    • * — 0 и более символов (до 65536).
    Как настроить 301 редирект htaccess

    Начнем с 301 редиректа в htaccess. Во-первых, он представляет из себя автоматическую переадресацию с одного адреса на другой. Он вполне может применяться в том случае, когда сайт переводится с протокола http на https, когда сайт перенастраивается с «полноразмерных» адресов на ЧПУ (т.е. было https://www.karcher.xyz/content/news/31-01-2017/razdatka , стало https://www.karcher.xyz/ razdatka), а также для «склеивания» страниц-дублей. Во-вторых, 301 редирект сообщает поисковым системам, что «ребята, имеющийся у вас адрес уже не работает, поэтому идите вон туда», а они такие «ОК, учтем». Таким образом, переадресация происходит безболезненно, без потери позиций и ссылочной массы.

    Но что будет, если «Ой, да ну нафиг? Буду я еще с переадресациями заморачиваться, только время потеряю!»? Можно сделать и так, НО… история «старой» страницы будет утрачена, а «новая» будет ранжироваться «с нуля». Как следствие - потеря позиций и ссылочной массы (это в лучшем случае).

    Варианты применения 301 редиректа:

    • Склейка доменов;
    • Переезд сайта на другой адрес (может пригодиться при попадании сайта под какие-либо фильтры);
    • Для увеличения показателей тИЦ, PR и увеличения трафика при покупке другого домена (настраивается редирект на ресурс, который нуждается в поднятии тИЦ и PR);
    • При смене движка сайта (в этом случае настройка 301 редиректов строго обязательна, в противном случае гарантирована полная потеря трафика);
    • при переезде с http на https;
    • склейка «дублей»

    и т.д., всех причин не перечислить.

    301 Редирект при смене домена основного сайта

    Итак, Вы решили сменить домен. Сразу же даем готовое решение:

    • переделываем robots.txt на старом домене. Готовый текст файла:

    User-agent: Yandex

    Host: newsite.com

    • настраиваем 301 редирект для всех страниц сайта (кроме файла robots.txt) с помощью приведенного ниже кода:

    RewriteCond %{REQUEST_FILENAME} robots.txt$

    RewriteRule ^([^/]+) $1 [L]

    RewriteCond %{HTTP_HOST} !^www\.site\.com

    301 редирект при смене адреса страницы

    Постраничный редирект (когда меняется адрес страницы) осуществляется с помощью приведенного ниже кода:

    RewriteEngine On

    RewriteCond %{HTTP_HOST} ^www\.stokrat\.org$

    RewriteRule ^stranica/nastrojka-301-redirekta/$ https://www.сайт/newpage/

    Именно этот код используется при «переезде» страниц, например, на ЧПУ.

    Настроить редирект с www на домен без www в htaccess

    Упоминание www. в адресе домена уже давно не является актуальным. Тем не менее сайтов с www. полно. Склеивание доменов с www. и без должно производиться в строго обязательном порядке, т.к. поисковые системы воспринимают эти 2 домена как 2 разных сайта с разными тИЦ, PR, посещаемостью, ссылочной массой и всем остальным. Следовательно, один из них - оригинал, а второй - «самозванец» с «ворованным контентом». Чтобы этого не происходило - домены с www. и без необходимо «склеить» с помощью 301 редиректа. Код настройки приведен ниже.

    Код редиректа с www на без www в htaccess выглядит так:

    RewriteEngine on
    RewriteCond %{HTTP_HOST} ^www.site.ru$

    Теперь давайте разберемся с директивами.

    RewriteEngine on/off - если выражаться простым человеческим языком - она служит выключателем 301 редиректа.

    RewriteCond — в этой директиве прописываются условия для «срабатывания» следующей директивы.

    RewriteRule — директива преобразования одного адреса в другой.

    Настроить 301 редирект с http на https через htaccess

    Переезд с http на https многие считают «современным трендом». Однако, на сегодняшний день данная мера является обязательной (хотя формально она таковой не является). И вот настал тот час, когда Вы получили SSL-сертификат, Ваш сайт уже работает и по http и по https. Все что осталось настроить в файле.htaccess 301 редирект с http на https версии страниц сайта. Код для настройки приведен ниже.

    RewriteRule ^(.*)$ https://site.ru/$1

    А вот код на обратный редирект с https на http. Как видите, отличие всего в 1 символ:

    RewriteCond %{SERVER_PORT} !^443$

    RewriteRule ^(.*)$ http://site.ru/$1

    Редирект со страниц index.php, index.html

    По большей части речь пойдет про склеивание дублей, которых может образовываться огромное количество.

    Поскольку в подзаголовке упомянуты index.php и index.html - Вы уже догадались, что с помощью 301 редиректа мы будем избавляться от дублей главной страницы:

    Однако, если у главной страницы есть дубль вида site.ru/index.php, вполне вероятно, что и у остальных страниц есть дубли вида site.ru/index.php/page.html (при оригинальном адресе site.ru/page.html ). Это плохо, поэтому также требуется настройка 301 редиректа с помощью приведенного ниже кода:

    RewriteRule ^index\.php/(.*)$ /$1

    Нередки случаи, когда у главной страницы есть дубль вида

    site.ru/main.html , для которого так же необходимо прописывать 301 переадресацию на site.ru :

    RewriteEngine On

    RewriteCond %{THE_REQUEST} ^{3,9}\ /main\.html\ HTTP/

    Либо альтернативный вариант:

    Redirect 301 /main.html HYPERLINK "http://site.ru/" http :// site . ru /

    А вот теперь рассмотрим обратную ситуацию - когда Вы хотите склеить дубли, настроив переадресацию с site.ru на site.ru/main.html . Сделать это можно с помощью приведенного ниже кода.

    RewriteCond %{REQUEST_URI} (.*/[^/.]+)($|\?)

    RewriteRule .* %1.html

    RewriteRule ^(.*)/$ /$1.html

    Ну а если Вам важно, чтобы адреса всех внутренних страниц отображались без.html на конце, то redirect настраивается вот таким кодом:

    RewriteCond %{REQUEST_URI} \.html$

    RewriteRule ^(.*)\.html$ /$1

    Теперь о том как сделать редирект со страницы на страницу а именно с.htm на страницы.html. Для настройки такой переадресации достаточно добавить в.htaccess следующий код:

    RewriteRule ^(.*)\.htm$ $1.html

    Редиректы с адресов со слэшами в конце и без них

    Для начала рассмотрим еще один вид дублей страниц - страницы вида http://site.xyz/page и http://site.xyz/page/ - кроме слэша в конце, они ничем не отличаются. Настраивать redirect можно и с первой на вторую, и со второй на первую. Рассмотрим оба варианта:

    Редирект с http://site.xyz/page на http://site.xyz/page/:

    RewriteCond %{REQUEST_FILENAME} !-f

    RewriteCond %{REQUEST_URI} !\..+$

    RewriteCond %{REQUEST_URI} !/$

    RewriteRule (.*) http://www.site.ru/$1/

    Redirect с http://site.xyz/page/ на http://site.xyz/page:

    RewriteCond %{REQUEST_FILENAME} !-d

    RewriteCond %{REQUEST_URI} ^(.+)/$

    RewriteRule ^(.+)/$ /$1

    Причем абсолютно не важно, будет ли у Вас после редиректа слэш в конце адреса или нет. Главное - чтоб эти адреса были склеены с помощью 301 редиректа.

    Редирект на мобильную версию сайта

    Разумеется, если Ваш сайт работает на движке WordPress или Joomla, то настроить редирект на мобильную версию сайта можно с помощью плагинов.

    Однако, Google является сторонником адаптивного дизайна. Следовательно, выделять отдельный домен/поддомен для мобильной версии не нужно. Т.е. в Google утверждают, что «если есть возможность обойтись без редиректов на мобильную версию - именно так и нужно поступать».

    Но что делать, если без таких редиректов все-таки не обойтись?

    Можно настроить редирект через файл.htaccess

    RewriteEngine On

    RewriteCond %{HTTP_ACCEPT} "text\/vnd\.wap\.wml|application\/vnd\.wap\.xhtml\+xml"

    RewriteCond %{REQUEST_URI} ^/$

    RewriteRule ^ http://m.domain.com%{REQUEST_URI}

    Настройка мобильного редиректа через PHP

    Необходимо воспользоваться специальной библиотекой Mobile Detect, она необходима для того, чтоб распознать, с мобильного устройства пришел пользователь, или со стационарного.

    $detect = new Mobile_Detect;

    if ($detect->isMobile()) {// код}

    if ($detect->isTablet()) {// код}

    if ($detect->isiOS()) {// код}

    if ($detect->isAndroidOS()) {// код}

    Из этого кода становится очевидно, что можно распознать не только компьютер/смартфон/планшет, но и его операционную систему.

    JavaScript редирект

    С помощью приведенного ниже кода происходит переадресация на мобильный поддомен. Основанием для переадресации служит разрешение экрана - до 480 пикселей в ширину. Именно в ширину, не в высоту.

  • if (screen.width на

    Способ 2. Настройка редиректа на site.com через.htaccess, вставив вот этот код:

    RewriteCond %{QUERY_STRING} ^route=common/home$

    RewriteRule ^index\.php$ http://site.com/?

    Таким же (а именно - вторым) способом можно настроить редиректы со старых адресов категорий на новые. По умолчанию адреса ссылок в OpenCart выглядят примерно следующим образом:

    site.com/index.php?path=83_94_113&route=product/category

    На такие ссылки смотреть очень больно, причем в прямом смысле, т.к. глаза реально начинают болеть при виде таких адресов. В том же.htaccess можно настроить редирект на «человеческие» адреса вида site.com/category с помощью такого кода:

    RewriteCond %{QUERY_STRING} ^path=83_94_113&route=product/category$

    RewriteRule ^index\.php$ http://site.com/new-category?

    Но что делать с динамическими адресами, которые из-за привязки к определенной секции имеют вид site.com/katalog?c=okna-pvkh ?

    Программисты довольно долго искали решение. «Методом тыка» (точнее - проб и ошибок) решение было найдено. В данном случае происходит редирект на главную страницу сайта:

    RewriteCond %{QUERY_STRING} ^c=okna-pvkh$

    RewriteRule katalog http://site.com/?

    Примечания и ошибки

    Теперь поговорим о том, как не допускать ошибок при настройке 301 редиректа:

    • Нельзя нарушать последовательность правил переадресации. После настройки редиректа необходимо убедиться, что настройка не дала каких-либо «побочных эффектов». Если нарушить последовательность правил, то ранее настроенные редиректы могут либо прекратить функционировать, либо функционировать неправильно. Противоречий в правилах быть не должно.
    • Не стесняйтесь пользоваться официальными мануалами, т.к. у 301 редиректа из-за непростого синтаксиса есть множество особенностей. Упустить какой-то нюанс при настройке - проще простого.
    • После очередных «допиливаний» ВСЕГДА проводите полную проверку работоспособности тех правил, которые были внедрены ранее. Настройка без проверки - это не настройка даже «для галочки». Один лишний символ может «обвалить» работу всего сайта, либо заставить его работать неправильно. За другими программистами нам уже не раз приходилось исправлять работу сайта, когда с адреса site.com/oldpage происходит 301 редирект на site.com/newpage , а затем с помощью того же 301 редиректа происходит переадресация обратно на site.com/oldpage и далее «по кругу».

    Ну и в заключение приведем несколько примеров, когда применять 301 переадресацию вообще нельзя.

    Во-первых, «многоходовки», когда идет череда из нескольких 301 редиректов подряд. Гораздо правильнее настроить редирект сразу на «финишный» адрес.

    Во-вторых, если по каким-то причинам есть 2 страницы с дублирующим контентом, но нужно сохранить для пользователей обе.

    В-третьих, редиректы «не туда». Т.е. если страница переехала с первого адреса на второй, а при настройке редиректа Вы ошибочно указываете адрес совершенно другой страницы.

    В-четвертых, redirect на страницу, которая работает по каким-то причинам очень некорректно. Страница должна работать стабильно и отдавать либо код 200, либо код 404.

    В-пятых, редирект файла robots.txt. Это запрещено правилами многих поисковых систем. Более того, многие допускают одну и ту же ошибку - когда настраивают htaccess редирект на https с http://site.xyz/robots.txt на https://site.xyz/robots.txt . Файл robots.txt должен быть доступен по обоим адресам без всяких переадресаций. Ровно то же самое касается и xml-карты сайта.

    6.1K

    Предположим, что вы хотите, чтобы пользователям, которые переходят на страницу https://example.com/initial.php отображалась страница https://example.com/final.php . Это можно сделать с помощью несколько методов PHP , JavaScript и HTML . В этой статье мы расскажем о каждом из методов, которые можно использовать для PHP перенаправления на другую страницу.

    Вот несколько переменных, которые мы будем использовать:

    Использование функции PHP header() для редиректа URL-адреса

    Если хотите добавить редирект с initial.php на final.php , можно поместить на веб-странице initial.php следующий код. Он отправляет в браузер новый заголовок location :

    Здесь мы используем PHP-функцию header() , чтобы создать редирект. Нужно поместить этот код перед любым HTML или текстом. Иначе вы получите сообщение об ошибке, связанной с тем, что заголовок уже отправлен. Также можно использовать буферизацию вывода, чтобы не допустить этой ошибки отправки заголовков. В следующем примере данный способ перенаправления PHP показан в действии:

    Чтобы выполнить переадресацию с помощью функции header() , функция ob_start() должна быть первой в PHP-скрипте . Благодаря этому не будут возникать ошибки заголовков.

    В качестве дополнительной меры можно добавить die() или exit() сразу после редиректа заголовка, чтобы остальной код веб-страницы не выполнялся. В отдельных случаях поисковые роботы или браузеры могут не обращать внимания на указание в заголовке Location . Что таит в себе потенциальные угрозы для безопасности сайта:

    Чтобы прояснить ситуацию: die() или exit() не имеют отношения к редиректам. Они используются для предотвращения выполнения остальной части кода на веб-странице.

    При PHP перенаправлении на страницу рекомендуется использовать абсолютные URL-адреса при указании значения заголовка Location . Но относительные URL-адреса тоже будут работать. Также можно использовать эту функцию для перенаправления пользователей на внешние сайты или веб-страницы.

    Вывод кода JavaScript-редиректа с помощью функции PHP echo()

    Это не является чистым PHP-решением . Тем не менее, оно также эффективно. Вы можете использовать функцию PHP echo() для вывода кода JavaScript , который будет обрабатывать редирект.

    Если воспользуетесь этим решением, то не придется использовать буферизацию вывода. Что также предотвращает возникновение ошибок, связанных с отправкой заголовков.

    Ниже приводится несколько примеров, в которых использованы разные методы JavaScript для редиректа с текущей страницы на другую:

    Единственным недостатком этого метода перенаправления на другой сайт PHP является то, что JavaScript работает на стороне клиента. А у ваших посетителей может быть отключен JavaScript .

    Использование метатегов HTML для редиректа

    Также можно использовать базовый HTML для выполнения редиректа. Это может показаться непрофессиональным, но это работает. И не нужно беспокоиться о том, что в браузере отключен JavaScript или ранее была отправлена ошибка заголовков:

    Также можно использовать последнюю строку из предыдущего примера, чтобы автоматически обновлять страницу каждые «n » секунд. Например, следующий код будет автоматически обновлять страницу каждые 8 секунд.

    Всем привет! В этой статье хочу наглядно показать как можно сделать редирект ваших пользователей используя для этого PHP, Apache или Nginx .

    Для начала стоит пару слов уделить определению того что такое редирект.
    Редирект – это автоматическое (принудительное) перенаправление посетителей сайта с одной страницы на другую. Для того чтобы при перенаправлении пользователя он понимал куда и почему его перенаправили то нужно указывать состояние для веб страницы. О состоянии страницы говорит код статуса HTTP .

    Редирект коды

    Нас интересуют следующие статус-коды редиректов:

    • 300 — Multiple Choices (несколько вариантов на выбор давая возможность сделать выбор пользователю).
    • 301 — Moved Permanently (запрошенный документ перемещен на новый URI).
    • 302 — Moved Temporarily (временный редирект по другому URI).
    • 303 — See Other (затребованный ресурс можно найти по другому адресу).
    • 304 — Not Modified (содержимое не изменялось — это могут быть рисунки, таблицы стилей и т.п.).
    • 305 — Use Proxy (доступ должен осуществляться через прокси-сервер).
    • 306 — Unused (не используется, зарезервирован).
    HTML редирект

    Возможно, самым простым способом для перенаправления на другой адрес будет мета-тег с refresh . Мы можем разместить этот мета-тэг внутри в верхней части любой HTML -страницы, к примеру, так:

    Атрибут «content » – это задержка перед тем, как браузер перенаправляет на новую страницу, наше значение 0 секунд. Обратите внимание, что мы не должны устанавливать HTTP-код, но важно дважды проверить странное открытие и закрытие кавычек.

    PHP редирект
    • Сергей Савенков

      какой то “куцый” обзор… как будто спешили куда то