How to redirect with php

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

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

<meta http-equiv="Location" content="http://example.com/final.php">
<!-- The following line will redirect after the given number of seconds. Zero in our case. -->
<meta http-equiv="refresh" content="0;url=http://example.com/final.php">

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

<meta http-equiv="refresh" content="8">

Как сделать редирект через файл htaccess

Для того, чтобы перенаправить пользователя с одной страницы на другую требуется использовать следующую комбинацию:

Redirect 301 site.ru/page1/ site.ru/page2/

Где:

  • page1- страница которая будет переадресовывать;
  • page2 – открывающийся документ.

Важно! Можно записывать адреса в относительном виде, например, /page1/ и /page2/. Также допускается использование конструкции:

Также допускается использование конструкции:

Redirect permanent site.ru/page1/ site.ru/page2/

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

Вводим нужное нам правило.

Разновидности редиректов и особенности их применения

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

Однако браузеры и поисковые боты различают каждый отдельный редирект. Для этого предусмотрены специальные коды. Например, есть 301 редирект htaccess. Давайте вкратце рассмотрим каждый код.

301

В этом случае определенная страница навсегда перемещена со старого УРЛ на новый. Когда система браузера получает код 301, она посылает еще один запрос и уже отправляет пользователя на новый «УРЛ».

Поэтому, если вы хотите перевести свой веб-ресурс на новый протокол https, можете смело использовать код 301. Все достижения сайта будут сохранены!

302

Здесь все не так просто и однозначно. Так, в HTTP 1.0 данный код указывал на то, что конкретный адрес был временно перемещен на новый «УРЛ».

В HTTP 1.1 у кода другое значение – он указывает на статус «Найдено». То есть, сайт есть, но он временно переместился по новому адресу

При этом данный код не передает важность и вес акцептору

303 и 307

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

Код 307, как говорилось выше, также может использоваться вместо 302. У него статус временного перенаправления – название Temporary Redirect. Новый запрос, выполняемый браузером, должен осуществляться только строго безопасным и автоматическим методом. Например, GET и HEAD.

Промежуточный вывод

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

Преимущество статуса 301 в том, что он полностью передает авторитетность и вес, ссылочный профиль новой странице.

Коды 303 и 307 применяются лишь в тех случаях, когда перенаправление нужно делать на протяжении определенного времени.

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

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

<?php
$new_url = 'https://example.com/final.php';
header('Location: '.$new_url);
?>

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

<?php
ob_start();
$new_url = 'https://example.com/final.php';
header('Location: '.$new_url);
ob_end_flush();
?>

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

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

<?php
$new_url = 'https://example.com/final.php';
header('Location: '.$new_url);
exit();
?>

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

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

Переадресация с http на https

При переезде сайта с http на https (установка SSL-сертификата) потребуется код, который не требует дополнительных модификаций:

RewriteEngine On

RewriteBase /

RewriteCond %{HTTP:X-HTTPS} !1

RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1

Второй метод осуществляет перенос с http://domain.ru на https://domain.ru:

RewriteEngine On

RewriteBase /

RewriteCond %{HTTP:X-HTTPS} !1

RewriteCond %{HTTP_HOST} ^domain\.ru$

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

Третий способ выполняет аналогичную функцию, но отключает перенаправление для robots.txt:

RewriteEngine On

RewriteBase /

RewriteCond %{HTTP:X-HTTPS} !1

RewriteCond %{REQUEST_URI} !robots.txt

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

В 4-й версии конечным пунктом для пользователя станет https://www.domain.ru:

RewriteEngine On

RewriteBase /

RewriteCond %{HTTP:X-HTTPS} !1

RewriteCond %{HTTP_HOST} ^domain\.ru$

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

Позволяет сделать форвардинг с http://www.poddomen.domain.ru на https://poddomen.domain.ru:

Options +FollowSymLinks

RewriteEngine On

RewriteCond %{HTTP_HOST} ^www\.poddomen\.domain\.ru$

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

RewriteBase /

RewriteCond %{HTTP:X-HTTPS} !1

RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1

Последняя версия, дающая возможность сделать связь между http://poddomen.domain.ru на https://www.poddomen.domain.ru:

Options +FollowSymLinks

RewriteEngine On

RewriteCond %{HTTP_HOST} ^poddomen\.domain\.ru$

RewriteRule ^(.*)$ https://www.poddomain.domain.ru/$1

RewriteBase /

RewriteCond %{HTTP:X-HTTPS} !1

RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1

Примеры использования редиректов

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

Перезапуск нового сайта / переезд сайтов

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

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

Наиболее распространенные сценарии использования редиректов при переезде сайта включают:

  • Перевод сайта на SSL и перенос URL-адресов с HTTP на HTTPS.
  • Перенос старого отдельного мобильного сайта на адаптивные страницы.
  • Переезд на новый домен. 
  • Обновление и переработка архитектуры сайта.
  • Изменение URL-структуры разделов на сайте. 
  • Замена старых страниц новыми материалами и т. д.

Наиболее распространенными типами редиректов, используемыми в этих сценариях, являются 301 постоянный и 302 временный, в зависимости от характера перенаправления.

Перенаправления по геолокации

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

Однако при использовании перенаправления по геолокации следует помнить о нескольких вещах. Прежде всего, Google советует не выполнять редирект на основе IP-адреса пользователя. Это также может сбить с толку его поисковых роботов и вызвать проблемы с индексированием контента. Вместо этого поисковая система рекомендует использовать настройки ccTLD и Google Search Console для таргетинга на международных пользователей. 

В этом случае наиболее распространенным типом перенаправления является временный 302 редирект. Сайт также может динамически обслуживать нужный контент. 

Таргетинг на устройства

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

Google рекомендует две реализации этого перенаправления – HTTP и JavaScript. 

Переадресация для кампаний PPC / партнерского маркетинга

В некоторых кампаниях PPC или партнерского маркетинга маркетологи предпочитают указывать перенаправления на исходную целевую страницу, а не использовать прямой URL. В случае партнерского маркетинга он может генерировать множество ссылок на URL-адрес в интернете. Однако из-за характера партнерского соглашения Google может воспринимать эти ссылки как купленные и наказывать сайт за несоблюдение рекомендаций для вебмастеров. 

Временное перенаправление без возможности кэширования помогает защитить сайт от санкций, в то же время позволяя трафику поступать на целевой URL. 

Перенаправления для A/B-тестирования

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

Фактически, Google рекомендует использовать редирект 302 и для этого типа тестирования.

Важные детали

умереть() или же выход()

Почему вы должны использовать или же : The Daily WTF

Абсолютный или относительный URL

С июня 2014 года можно использовать как абсолютные, так и относительные URL. Увидеть который заменил старый , где разрешены только абсолютные URL.

Коды состояния

Заголовок PHP «Location» все еще использует HTTP 302-перенаправить код, но это не тот, который вы должны использовать. Вы должны рассмотреть либо (постоянное перенаправление) или (Другой).

Замечания: что заголовок 303 несовместим со «многими пользовательскими агентами до HTTP / 1.1. В настоящее время все используемые браузеры являются пользовательскими агентами HTTP / 1.1. Это не так для многих других пользовательских агентов, таких как пауки и роботы.

.htaccess

Одним из самых гибких методов настройки сервера Apache является использование конфигурационных файлов .htaccess. Установки из этих файлов имеют более высокий приоритет, чем установки в конфигурационных файлах httpd.conf сервера Apache (если не запрещена замена установок), и действуют на каталог, в котором находится данный файл .htaccess, а также на все дочерние каталоги (если только в каких-либо из них нет своих файлов .htaccess — тогда установки из .htaccess текущего каталога аннулируют установки из .htaccess родительского).

Сейчас наша основная задача состоит в том, чтобы централизовать управление сервером — передать его какому-то одному скрипту, пусть это будет, например, скрипт index.php в корневом каталоге веб-сервера. Поскольку мы хотим перенаправлять таким образом абсолютно любой запрос, файл .htaccess следует создать также в корневом каталоге. Для решения нашей задачи этот файл должен содержать всего две строчки:

RewriteEngine onRewriteRule .*? index.php

Директива RewriteEngine on отвечает за включение механизма mod_rewrite (без неё он просто не начнет работать)

Директива RewiteRule не так проста в использовании и также является исключительно важной в описываемой реализации, поэтому обсудим её подробнее

Как уже говорилось, основная часть задачи состоит в том, что необходимо передать управление. Этим как раз и занимается директива RewriteRule. Синтаксис использования этой директивы в .htaccess таков:

RewriteRule условие что_делать

В качестве условия выступает Perl-совместимое регулярное выражение (mod_rewrite использует библиотеку PCRE), которое сравнивается со строкой URL (если запрошен адрес http://site.ru/news/123.html, то строкой URL будет /news/123.html). Поскольку нам требуется запустить механизм в любом случае, следует составить такое регулярное выражение, которое совпало бы с любой строкой. Для этого хорошо подходит .*?.

Второй аргумент директивы (что_делать) — это указание серверу о том, как ему изменить адрес запроса. Нам нужно абсолютно все запросы направить к скрипту index.php, находящемся в том же каталоге, что и .htaccess; это и отражено в директиве.

Особенности реализации редиректа на PHP

301 редирект – принудительная переадресация посетителя с одного урл-адреса на другой. При этом оба адреса могут находиться как на одном домен, так и на разных.

Другими словами, посетитель вбивает в поиске браузера (или напрямую открывает ссылку) один урл-адрес, при этом автоматически попадает на другой. Процесс переадресации настолько быстрый, что пользователь ничего не замечает.

Как работает 301 редирект?

  1. Пользователь указывает URL адреса в строке браузера или кликает на ссылку.
  2. Сервер получает запрос с адресом и приступает к его обработке.
  3. Во время обработки запроса получает инструкцию редиректа и придерживается его правилам.
  4. В результате посетитель получает другой урл-адрес, который был прописан в инструкции 301 редиректа.

При этом правило 301 редиректа действует не только для посетителей, но и для поисковых ботов. Краулер Google или Яндекс тоже переходит на другой адрес, если настроена переадресация.

Какие задачи выполняет 301 redirect

Основная задача редиректа – перенаправить трафик на новый адрес (вместе с тем, передается и вес страницы). В каких случаях требуется такое мероприятие? Основные из них:

  • Изменился URL страницы, поэтому необходимо перенаправить посетителей на новый.
  • Сайт переехал на новый домен, поэтому появилась необходимость в настройке 301 редиректа.
  • Одна страница доступна под несколькими URL-адресами (дублирует себя).
  • При работе онлайн-сервисов, модулей, форум и других интерактивных элементов ресурса требуется настройка перенаправления.

Настроить 301 редирект можно только, если у вас есть доступ к сайту. Прописать переадресацию для любого адреса в сети, не получится. Поэтому редирект считается «официальным», так как его указывает сам владелец ресурса. Поисковые роботы лояльно относятся к таким действиям. Вот что об этом говорит Яндекс в Справке.

Как реализовать 301 redirect посредством PHP

Несмотря на то, что большинство вебмастеров предпочитают задавать правило переадресации через файл .htaccess, иногда возникает потребность реализации и через php. Способ это не менее простой. Достаточно прописать следующее содержимое на странице, с которой запланирована переадресация:

<?php header(“HTTP/1.1 301 Moved Permanently”); header(“Location: http://www.new-domain.ru/page.php”); exit(); ?>

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

Существует и другое решение реализации редиректа 301 на php. Например, если сайт переехал на другой домен, но урл-адреса сохранились:

<? $ref=$_SERVER; if ($ref!=») $ref=’?’.$ref; header(‘HTTP/1.1 301 Moved Permanently’); header(‘Location: http://new-domain.ru/’.$ref); exit(); ?>

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

Как проверить, сработал ли redirect

После того, как вы все настроили, нужно убедиться в работоспособности 301 редиректа. Для этого достаточно выполнить следующие шаги:

  1. Убедитесь, что сайт доступен. Загрузите главную страницу.
  2. Проверьте основные разделы и страницы на наличие ошибок.

Для комплексной оценки работы редиректов можете воспользоваться одним из сервисов:

  • – подробный отчет об ответе сервера. – простой и удобный инструмент. – проверка редиректа для своего сайта.

Выводы

301 редирект – важная и полезная инструкция, которая используется при изменении адреса одной или нескольких страниц сайта. Благодаря автоматической переадресации вы не потеряете трафик и позиции со старой версии страницы. Поисковые роботы понимают эту команду и относятся к ней адекватно.

Перенаправление запросов для отсутствующих доменов (перенаправление по умолчанию)

Если обращение к веб-серверу идет по IP-адресу или домену, который не прописан в конфигурационном файле, можно перенаправить весь трафик на домен по умолчанию:

server {
        listen 80 default_server;
        return 302 https://welcome.domain.ru$request_uri;
}

или независимо от протокола:

server {
        listen 80 default_server;
        return 302 $scheme://welcome.domain.ru$request_uri;
}
server {
        listen 443 ssl default_server;
        return 302 $scheme://welcome.domain.ru$request_uri;
        ssl_certificate /etc/nginx/ssl/cert.pem;
        ssl_certificate_key /etc/nginx/ssl/cert.key;
}

* $scheme позволяет перевести запрос на тот же протокол (http или https), по которому он был инициирован.
* если nginx должен слушать и обрабатывать запросы по https, необходимо указывать в настройках пути к сертификатам.

Как исправить ошибку перенаправлений (редиректов)

Шаг n. 1. Очистите кеш браузера и удалите файлы cookie

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

  • В Mozilla Firefox нажмите кнопку «Меню» и выберите «Параметры». Выберите Конфиденциальность, а затем очистите свою недавнюю историю. Выберите «Все» для временного интервала, затем нажмите «Очистить сейчас).
  • В Google Chrome нажмите Ctrl + Shift + Del, выберите необходимые данные, продолжительность данных и нажмите Очистить данные

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

Шаг n. 2: попробуйте в других браузерах

Ошибка ERR_TOO_MANY_REDIRECTS может возникать только в используемом вами браузере. Вы можете попробовать открыть тот же URL в другом браузере. Если ошибка не исчезнет, ​​проблема может быть на стороне сервера.

Редирект в JavaScript

Метод позволяет заменить одну страницу другой таким образом, что это замещение не будет отражено в истории просмотра HTML-страниц (history) браузера

location.replace("https://www.google.com");
document.location.replace("https://www.google.com");

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

window.location.reload("https://www.google.com");

Следующие примеры тоже перенаправят на google:

location="https://www.google.com";
document.location.href="https://www.google.com";

С помощью функции возможно реализовать задержку переадресации перед выполнением редиректа (в примере — 5 секунд):

setTimeout( 'location="https://www.google.com";', 5000 );

Простой пример редиректа с таймером:

<script type="text/javascript">
var sec=10;
 function Sec()
 {
  document.getElementById("sec").innerHTML=sec;
   sec--;
   if(sec==1)
   {
   	  location.replace("https://www.google.com")
   }
   setTimeout('Sec()',1000);
 }

 Sec();
</script>
<p>Подождите пожалуйста <span style="color:red;font-weight: bold;" id="sec" name="sec">10</span> сек или перейдите по этой ссылке: <a href="https://www.google.com">https://www.google.com</a></p>

Зачем настраивать редирект

Есть несколько основных причин перенаправлять пользователя на другой URL. Давайте рассмотрим их подробнее.

Для указания главной версии сайта

Возможно, вы замечали, что адрес одних сайтов начинается с https, а других — с http. Также иногда в адресе указан префикс www, а иногда его нет. Выбор протокола и решение использования www перед основным доменом определяют главное зеркало ресурса. Это основная версия сайта, на которую перенаправляют всех пользователей, если они вводят в строку поиска альтернативный вариант URL-адреса.

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

Для решения проблемы дублей

Дубли страниц возникают не только из-за разных протоколов и префикса www в URL-адресе, но и по ряду других технических причин. Также иногда дублируется сам контент — страницы-копии обычно удаляют, а с них настраивают редирект.

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

Перенаправление при добавлении завершающего слеша

Когда вы вбиваете адрес страницы в строку поиска, то скорее всего не добавляете слеш в конце. Иногда браузер сам «дописывает» его к URL-адресу — происходит это благодаря редиректу. Как и в случае с протоколом и www, вебмастеру нужно определиться, будут ли на сайте использоваться завершающие слеши, чтобы избежать проблем с дублями.

Ниже мы адаптировали схему, которой аналитик Google Джон Мюллер поделился в своем аккаунте Twitter.  

Как вы видите, иногда завершающие слеши приводят к дублированию, а иногда нет. Например, в варианте F и G можно легко получить дублированный контент.

Решить проблему можно двумя способами: использовать тег canonical либо установить перенаправление на нужный вам вариант страницы.

Перенаправление при использовании расширения файлов в URL

Иногда в конце адреса страницы указывается расширение файла, например, .html, .htm, .php, .aspx. Чтобы пользователь, вбивая в строку поиска URL вида https://site.com/page/, все равно попал на страницу https://site.com/page.html и чтобы избежать дублирования контента, используется перенаправление.

Перенаправление URL-адреса в нижний регистр

Один и тот же URL-адрес, прописанный в верхнем и нижнем регистре, — это две разные страницы. Правило хорошего тона — использовать в URL нижний регистр. Поэтому чтобы адрес вида https://site.com/PAGE/ был доступен только как https://site.com/page/, также применяется перенаправление. Естественно, редирект здесь нужен и для того, чтобы предотвратить проблемы с дублями. 

Для сохранения ссылочного веса и трафика при смене URL

URL-адрес страницы может поменяться по разным причинам: после миграции на новую CMS, в ходе изменения структуры сайта или в процессе борьбы с дублированным контентом. В результате вы получите страницу с новым адресом, которая отвечает на тот же запрос пользователя, что и старая страница. Редирект позволяет не только перенаправить трафик на актуальную страницу, но и сохранить вес внешних ссылок, указывающих на старый адрес. 

Например, вы использовали страницу https://site.com/festivals-2020/, но в конце года решили обновлять контент страницы и публиковать на ней все фестивали следующего года. Чтобы убрать из URL-а прошлый год, вы решаете создать новую страницу https://site.com/festivals/. Эта страница будет постоянно обновляться и содержать контент, который ранее публиковался на странице https://site.com/festivals-2020/. Чтобы избежать каннибализации, вы принимаете решение удалить старую страницу https://site.com/festivals-2020/ и перенаправить трафик и ссылочный вес на новую страницу https://site.com/festivals/.

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

Рейтинг
( Пока оценок нет )
Editor
Editor/ автор статьи

Давно интересуюсь темой. Мне нравится писать о том, в чём разбираюсь.

Понравилась статья? Поделиться с друзьями:
Люкс-хост
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: