Последние тенденции все чаще намекают, что редиректы - зло. И если коробочные (SaaS) решения могут сделать это за вас, то классические php-based клиенты, как правило, так делать не умеют. Да и не нужно им это. Как правильно отображать проклу БЕЗ редиректа - расскажу под катом.Редиректы на внутреннюю страницу, в последнее время - абсолютное зло. Во всяком случае под фб. Именно поэтому, все представители сервисов клоакинга и трекинга рекомендуют render html для показа проклы. Т.е. показывать проклу без редиректа. Для self-hosted хранимых прокл есть только один вменяемый способ сделать это - инклудить файл проклы на уровне php. Т.е. при положительном ответе клоаки инклудим проклу, а при отрицательном - сейф. Но возникает проблема - подгрузка ресурсов. Как правило, прокла лежит в другой папке, и пути до ресурсов будут иными. И тут нам поможет не сильно популярный тег base.
Покажу на примере.
В корне домена у нас лежит index.php с содержимым
<?php
if $ismoder == true {
include 'white.php';
} else {
include 'moneydir/money.php';
}
?>
где white.php - страница для модеров/ботов
moneydir - директория проклы со всеми ресурсами
money.php - прокла
кстати, сейфпейдж все же лучше класть в корень папки/домена, чтоб лишний раз не триггерить проверяющих
Итак. Если файлы сейфа и так лежат в корне и проблем с этим нет, то, для порядка, манипейдж лежит в директории. И пути до ресурсов у нас будут уже другие. А без них прокла будет отображаться некорректно. И казалось бы - в чем проблема, просто пропиши пути в прокле статично и радуйся. Но что делать, когда таких прокл несколько тысяч? И названия папок постоянно меняются. И хотелось бы автоматически все?
А решается все просто: нужно лишь указать браузеру, где у нас лежат файлы ресурсов. Поможет в этом тег base.
Добавляем в тело индекса эту функцию
function makeBase($path) {
$pp = pathinfo($path);
return '<base href="https://' . $pp['dirname'] . '/">' . "\n";
}
Путь инклуда переносим в переменную:
$includeme = 'moneydir/money.php';
Приводим проклы к следующему виду:
<!DOCTYPE html>
<html lang="en">
<head>
<? echo((makeBase($includeme)); ?>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link rel="stylesheet" href="assets/style.css">
<script src="js/main.js"></script>
</head>
<body>
<img src="imgs/logo.png" alt="">
<h1>money page</h1>
</body>
</html>
Обращаю внимание, что пути до ресурсов должны быть релятивными! Т.е. без домена, протокола или слеша! В примере это css, img, js файлы.
В итоге всех манипуляций, мы должны получить следующее.
index.php (лежит в корне домена):
<?php
// путь до манипейджа/проклы
$includeme = 'moneydir/money.php';
// функция формирования baseurl
function makeBase($path) {
$pp = pathinfo($path);
return '<base href="https://' . $pp['dirname'] . '/">' . "\n";
}
// "клоака"
if $ismoder == true {
include 'white.php';
} else {
include $includeme;
}
?>
Модификации манипейжа приведены чуть выше.
Закономерный вопрос: "а зачем оно мне надо? пишу пути для каждой проклы и не парюсь". Ответ:
1) экономия времени: прописывать пути постоянно занимает несколько больше времени.
2) меньше шансов ошибиться: чем меньше ручной работы, тем этот шанс ниже.
3) уменьшение дублирования файлов. если в исходной прокле была ошибка, то при копировании она будет жить и плодиться. И чтобы ее поправить, придется перелопатить много-много времени.
4) организованность хранения прокладок. При дополнительной настройке моего любимого вебсервера Nginx можно вообще скидывать все проклы в одну папку и подключать их по необходимости на любом домене. Это замечательно работает с проксированием - советую ознакомиться с материалом. Если будет интерес - разберу эту тему в следующих постах.