Перенаправление на основе домена в URL-переменной

В настоящее время я работаю над новой системой ссылок для моих партнерских сайтов. Тем не менее, я все еще относительно неопытен в области PHP, хотя мне всегда это удавалось. Партнерские ссылки имеют другую структуру, и я хотел бы создать URL-адрес с помощью PHP, с помощью которого они автоматически предоставляются со структурой. Я не могу описать это очень хорошо, но я все же попробую это на примере:

Пользователь X вводит URL-адрес «example.net/ref.php?url=NORMAL_URL», и в зависимости от домена в «NORMAL_URL» применяется структура. Например, к URL-адресу «example.net/ref.php?url=http://example.de/". Если URL-адрес "example.net/ref.php?url=http://example.nl/" направлен to "affiliate_network.de/encoded_url=http%3A%2F%2Fexample.nl%2F Надеюсь, вы хоть немного это поняли. Спасибо за любую помощь!

Для лучшего понимания:


person techk    schedule 20.07.2017    source источник
comment
Итак, чтобы помочь мне лучше понять, как эта работа, вы можете подтвердить, соответствует ли этот пример тому, что вы пытаетесь сделать. Вы хотите, чтобы example.net/ref.php?Aff=XYZ&url=httl://example.de/ затем перенаправлял на URL-адрес, связанный с партнером XYZ. Если XYZ означает, что вы хотите перенаправить на affiliate_network.de из example.net с encoded_url из url части example.net? И для каждого ?Aff=<identifier here> комбо affiliate_network.de будет переходить на партнерский сайт. Это правильно?   -  person Mic1780    schedule 20.07.2017
comment
Не совсем, я как-то пытался сделать графически что-то понятное: prntscr.com/fy6yf5   -  person techk    schedule 20.07.2017


Ответы (1)


Отправьте URL-адрес в эту функцию, она использует preg_match с регулярным выражением из здесь для извлечения часть домена.
$matches будет массивом с доменом в элементе 1, поэтому вы можете найти его с помощью $matches[1]
Эта функция проверяет, является ли массив пустым (домен не найден), и в этом случае возвращает значение null. Затем использует переключатель для сравнения совпадающего домена со списком доменов, которые вы можете указать, если ни один из перечисленных доменов не соответствует, он снова вернет значение null

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

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

function getReturnFromURL($url) {
    $matches = null;
    preg_match("/^(?:https?:\/\/)?(?:[^@\n]+@)?(?:www\.)?([^:\/\n]+)/im", $url, $matches);
    if (empty($matches)) return null;
    switch ($matches[1]) {
        case "ebay.de":
            return "ebay-network.de/XXX?encoded_url=the_encoded_?-{$matches[1]}";
            break;
        case "amazon.de":
            return "amazon.de/XXX?encoded_url=the_encoded_?-{$matches[1]}?tag=XYZ";
            break;
        default:
            return null;
    }
}
person Darren H    schedule 20.07.2017
comment
Большое спасибо! Однако я не понимаю, что я редактирую во второй и четвертой строке. Спасибо за любую помощь! - person techk; 22.07.2017
comment
То, что вам нужно изменить, будет зависеть от того, что именно вы хотите сделать. Я написал довольно общий ответ, который послужил бы для вас хорошей базой, но я не мог адаптировать его более конкретно, потому что я не совсем понимаю, каковы ваши требования. - person Darren H; 22.07.2017
comment
Здравствуйте, код проверяет, является ли переменная именно amazon.de в этом примере. Переменная должна содержать только amazon.de. До и после, остальная часть ссылки, если это так с этим кодом, срабатывает по умолчанию. В ожидании ответа от вас! - person techk; 22.07.2017
comment
Регулярное выражение примет полный URL-адрес как $url и вернет доменную часть. Например, если $url = 'https://stackoverflow.com/abc/def?xyz=123, то $matches[1] будет содержать 'stackoverflow.com'. Затем If проверяет это для каждого домена, который вы хотите обработать, и выполняет разные задачи в зависимости от того, какой это домен. Если это не то, чего вы хотели, то я вас неправильно понял. - person Darren H; 22.07.2017
comment
Было бы понятнее, если бы вы привели реальные примеры, а не неполные примеры, потому что вашему объяснению довольно сложно следовать. - person Darren H; 22.07.2017