Браузер сообщает сайту с какой страницы пришёл посетитель. В Mozilla Firefox можно на пустом месте нажать правую клавишу мышки и вывести информацию о странице. В появившемся окне нужно обратить внимание на поле "Ссылающийся URL". Эти данные передаются и в PHP, и в JS.
Как узнать адрес страницы, откуда пришёл посетитель на 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 будет пустым, если пользователь
- ввел адрес в строку браузера самостоятельно,
- открыл страницу из закладок браузера,
- перешёл по текстовой неактивной ссылке,
- перешёл по странице, на которой указан мена-тег
referrerсо значениемnoneилиnever, - перешёл со страницы 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]
- перешёл по ссылке с атрибутом rel="noreferrer",
- перешёл со страницы с редиректом,
- использует браузер или дополнение, при котором
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.html | https://site.ru/
|
с https://site.ru/page.html на https://site.ru/page1.html | https://site.ru/page.html
|
с http://site.ru/page.html на http://site.ru/page1.html | http://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.html | https://site.ru/
|
с https://site.ru/page.html на https://site.ru/page1.html | https://site.ru/
|
с http://site.ru/page.html на http://site.ru/page1.html | http://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: пример
Комментариев нет: