Document.referrer: получить URL предыдущей страницы (та, с которой пришёл посетитель) | JavaScript

Браузер сообщает сайту с какой страницы пришёл посетитель. В Mozilla Firefox можно на пустом месте нажать правую клавишу мышки и вывести информацию о странице. В появившемся окне нужно обратить внимание на поле "Ссылающийся URL". Эти данные передаются и в PHP, и в JS. Ссылающийся URL в Mozilla Firefox

Как узнать адрес страницы, откуда пришёл посетитель на JS


<button type="button" onclick="alert(document.referrer)">адрес предшествующей страницы</button>

Как получить сайт, с которого пришёл посетитель


<button type="button" id="raz2">домен предшествующей страницы</button>

<script>
document.getElementById('raz2').onclick = function() {
    var a = document.referrer;
    if (a != '') {
        alert(new URL(a).hostname); // использовать только домен, подробнее про new URL()
    }
}
</script>

<button type="button" id="raz4">домен без поддоменов предшествующей страницы</button>

<script>
document.getElementById('raz4').onclick = function() {
    var a = document.referrer;
    if (a != '') {
      a = new URL(a).hostname.split('.');
      if (a.length >= 2) alert(a[a.length-2] +'.'+ a[a.length-1]);
    }
}
</script>

Как узнать адрес страницы, откуда пришёл посетитель на PHP

echo isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : ''; 

Почему Referrer отсутствует

Referrer будет пустым, если пользователь

  1. ввел адрес в строку браузера самостоятельно,
  2. открыл страницу из закладок браузера,
  3. перешёл по текстовой неактивной ссылке,
  4. перешёл по странице, на которой указан мена-тег referrer со значением none или never,
  5. перешёл со страницы HTTPS, на которой не указан мена-тег referrer, на страницу HTTP:
    Clients SHOULD NOT include a Referer header field in a (non-secure) HTTP request if the referring page was transferred with a secure protocol. [w3.org]
  6. перешёл по ссылке с атрибутом rel="noreferrer",
  7. перешёл со страницы с редиректом,
  8. использует браузер или дополнение, при котором Referrer возвращается пустым/изменённым.

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

Как изменить Referrer

Мета-тег Referrer (важно для HTTPS)

Можно управлять передачей Referrer с помощью мета-тега [w3.org]

Возвратить пустой Referrer
<meta name="referrer" content="none"> <!-- или --> <meta name="referrer" content="never">
с https://site.ru/page.html на https://site.ru/page1.html
Возвратить пустой Referrer при переходе с HTTPS на HTTP, иначе — полный URL (действие по умолчанию когда мета-тег не указан)
<meta name="referrer" content="default"> <!-- или --> <meta name="referrer" content="none-when-downgrade">
с https://site.ru/page.html на http://site1.ru/
с https://site.ru/page.html на https://site1.ru/https://site.ru/page.html
с http://site.ru/page.html на https://site1.ru/http://site.ru/page.html
с http://site.ru/page.html на http://site1.ru/http://site.ru/page.html
Возвратить полный URL при переходе между страницами одного сайта, иначе — значение origin (протокол + домен + порт)
<meta name="referrer" content="origin-when-crossorigin">
с https://site.ru/page.html на https://site1.ru/https://site.ru/
с https://site.ru/page.html на https://sub.site.ru/https://site.ru/
с https://site.ru/page.html на http://site.ru/page1.htmlhttps://site.ru/
с https://site.ru/page.html на https://site.ru/page1.htmlhttps://site.ru/page.html
с http://site.ru/page.html на http://site.ru/page1.htmlhttp://site.ru/page.html
Возвратить значение origin
<meta name="referrer" content="origin">
с https://site.ru/page.html на https://site1.ru/https://site.ru/
с https://site.ru/page.html на https://sub.site.ru/https://site.ru/
с https://site.ru/page.html на http://site.ru/page1.htmlhttps://site.ru/
с https://site.ru/page.html на https://site.ru/page1.htmlhttps://site.ru/
с http://site.ru/page.html на http://site.ru/page1.htmlhttp://site.ru/
Возвратить полный УРЛ
<meta name="referrer" content="always"> <!-- или --> <meta name="referrer" content="unsafe-url">
с https://site.ru/page.html на http://site1.ru/https://site.ru/page.html

По умолчанию сайты HTTP не видят в своей статистике переходы с сайтов HTTPS. Представим ситуацию. Рекламодатель разместил рекламный материал на сайте HTTPS и ждёт, что оттуда будут идти посетители. Но их нет в статистике. Что делать:

  • рекламодателю перейти на протокол HTTPS (сложно),
  • использовать UTM-метки (надёжно),
  • установить на сайте HTTPS мета-тег Referrer (просто).

Атрибут noreferrer

Можно передавать Referrer по всем ссылкам, кроме тех, где указан атрибут noreferrer:

<a href="URL" rel="noreferrer">анкор</a>

Статья по теме: Все атрибуты ссылки

Свойства объекта document.referrer

При этом заголовок Referer не меняется, он контролируется браузером пользователя


<button type="button" id="raz3">Изменить document.referrer</button>

<script>
document.getElementById('raz3').onclick = function() {
  Object.defineProperty(document,"referrer",{get : function(){ return "http://поддомер.новый.ru/папка"; }});
  alert(document.referrer);
}
</script>

Чем заменить Referer

При исполнении запросов с конкретного сайта, надёжнее проверить значение Origin

if($_SERVER['HTTP_ORIGIN'] == "http://shpargalkablog.ru") {}

При сборе адресов своего сайта, лучше в параметрах передавать window.location: пример

в f t
наверх ↑

Комментариев нет: