Cover Image

Правильное отображение прокладки

October 17, 2020 - Reading time: 3 minutes

Последние тенденции все чаще намекают, что редиректы - зло. И если коробочные (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 можно вообще скидывать все проклы в одну папку и подключать их по необходимости на любом домене. Это замечательно работает с проксированием - советую ознакомиться с материалом. Если будет интерес - разберу эту тему в следующих постах.

Об этом блоге

Уголок махрового технаря, ни больше ни меньше. Пытался спамить и арбитражить, но пришел к сугубо технарскому ремеслу. Немного кода, немного сисадминства, практикую дендрофекальные методы решения проблем. Но если это выглядит тупо, но работает - то это не тупо.