Перенаправление на переименование удаленных изображений, чтобы обойти блокировку рекламы

Я работаю с партнером, который предоставляет мне изображения своих продуктов через API. Изображения отправляются в виде URL-адресов, и они ожидают, что я просто буду использовать эти URL-адреса в тегах img, а не загружать изображения и обслуживать их локально.

Проблема в том, что 1/4 пользователей используют блокировщики рекламы, а их изображения имеют такие URL-адреса, как https://example.com/ad-image/ads/1234/500.jpg, которые читаются блокировщиками рекламы как реклама (технически они, конечно, так и есть). Можно ли настроить перенаправление, чтобы тег img, например <img src = "/image-redirects/500.jpg">, показывал им изображение из https://example.com/ad-image/ads/1234/500.jpg? Это осуществимо? Будут ли они все равно не отображаться, потому что они размещены удаленно?

«Они все равно не появятся, потому что они размещены удаленно?» - Что ты имеешь в виду? Я полагаю, что большинство объявлений размещаются «удаленно».

CBroe 11.12.2020 08:40

Перенаправление не обманет блокировщик рекламы. Если вы действительно настаиваете на том, чтобы попытаться быть умным и нарушить четкую волю пользователя (так, если вы хотите расстроить и раздражать пользователя), вам нужно будет проксировать запросы. Что добавит нагрузку на вашу установку. Мой совет: никогда не пытайтесь быть умнее своих пользователей. Если они не хотят видеть эти изображения, не заставляйте их.

arkascha 11.12.2020 09:06

@arkascha вы, вероятно, правы, и в целом я согласен с мнением, но на самом деле это не реклама, это изображения продуктов на странице, полной информации о продуктах. В именах файлов есть слово «реклама» в путях, поэтому блокировщики рекламы не позволяют им появляться.

pg. 14.12.2020 22:34

Звучит подозрительно, извините. Блокировщики рекламы не реагируют на части «пути», они контролируют, из каких источников загружаются дополнительные ресурсы и какова связь между фактической страницей и этими источниками. Выше я рассказал вам единственный способ обойти это, который вы видимо не читали.

arkascha 15.12.2020 08:37

Да, ты прав. Я просто настроил задание cron для ежедневной загрузки изображений и их локального размещения.

pg. 16.12.2020 18:10

Но блокировщики рекламы смотрят на имена файлов и пути. Только изображения со словом «реклама» в пути и имени файла блокировались ABP.

pg. 16.12.2020 18:11
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
6
303
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Можно ли настроить перенаправление, чтобы тег img, например <img src = "/image-redirects/500.jpg">, показывал им изображение из https://example.com/ad-image/ads/1234/500.jpg?

Да, вы можете, но не с внешним «перенаправлением», так как это просто представит целевой URL-адрес браузеру в ответе на перенаправление (и будет заблокирован, если браузер блокирует просто на основе ключевых слов в URL-адресе).

Обратный прокси

Вам нужно либо настроить свой сервер как обратный прокси (используя mod_proxy и связанные модули с идеально ProxyPass / ProxyPassReverse в конфигурации сервера), затем вы можете сделать что-то вроде следующего в .htaccess (перед фронт-контроллером WordPress), используя mod_rewrite для направить запрос через mod_proxy:

RewriteRule ^image-redirects/(\d+\.jpg)$ https://example.com/ad-image/ads/1234/$1 [P]

(Предполагая, что 500 - это динамическое имя файла, состоящее только из цифр, как в вашем примере).

PHP-скрипт для получения изображения

Или вы внутренне переписываете такие запросы в скрипт PHP, который извлекает изображение с удаленного сервера и отправляет его обратно в ответ.

Например, в .htaccess, используя mod_rewrite (опять же, перед фронт-контроллером WP):

RewriteRule ^image-redirects/(\d+\.jpg)$ image-fetch-script.php?file=$1 [L]

В image-fetch-script.php вы можете проверить параметр file URL и получить нужное изображение с удаленного сервера и отправить его обратно клиенту в ответе. Вы также можете кэшировать изображение на своем сервере в течение определенного периода времени. Однако тот факт, что они хотят, чтобы вы загружали изображения непосредственно с их сервера, может быть связан с тем, что они регистрируют показы, поэтому на это повлияет локальное кэширование.

Пример image-fetch-script.php может быть примерно таким:

<?php
/**
 * Fetch remote image and send to client
 */

// Remote URL from which to fetch images
$remoteBaseUrl = 'https://example.com/ad-image/ads/1234/';

// Permitted file extensions / mime-types
// NB: If using CURL, can get the mime-type from the HTTP response instead
$mimeTypes = [
    'gif' => 'image/gif',
    'jpg' => 'image/jpeg',
    'png' => 'image/png',
    'webp' => 'image/webp',
];

// Get the reqd file the "file" URL parameter in the rewritten URL
$file = $_GET['file'] ?? null;
$remoteUrl = null;

// Validate filename format
// Or even check against a known list of files?
$filenameRegex = '/^[\w-]+\.('.implode('|',array_keys($mimeTypes)).')$/';
if (preg_match($filenameRegex, $file, $matches)) {
    header('Content-Type: '.$mimeTypes[$matches[1]]);
    $remoteUrl = $remoteBaseUrl.$file;

    // OPTIONAL: Check cache here...
    // readfile() and exit if current.

    // Using readfile()
    // - simple, but does not provide any error handling on the HTTP response
    //   eg. if the remote file does not exist etc.
    //$bytes = readfile($remoteUrl);
    //if ($bytes === false) {
    //    General 500 Internal Server Error
    //    http_response_code(500);  
    //} else {
    //    // No error - assume success!
    //    // But there could have been an HTTP response "error" that is lost
    //}
    //exit;

    // Using CURL
    $ch = curl_init($remoteUrl);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $content = curl_exec($ch);
    $curlError = curl_errno($ch);
    if ($curlError) $curlError .= ': '.curl_error($ch);
    $httpStatus = curl_getinfo($ch,CURLINFO_RESPONSE_CODE);
    curl_close($ch);

    if ($curlError) {
        // Only set header when debugging, otherwise could expose the target URL
        //header('X-CURL-ERROR: '.$curlError);

        // General 500 Internal Server Error
        http_response_code(500);    
    }
    // CURL request is OK, but could still be an HTTP failure...
    else {
        // OK - serve image
        if ($httpStatus === 200) {
            // OPTIONAL: Save to cache...
            echo $content;
        }
        // Pass through HTTP status from CURL request... 404, 403, etc...
        else {
             http_response_code($httpStatus);
        }
    }
    exit;
}

// Default failure... "Bad Request"
http_response_code(400);

О, это кажется хорошим способом сделать это! Я попробую это.

pg. 14.12.2020 20:22

Я обновил свой ответ, включив в него пример PHP-скрипта для извлечения удаленного изображения.

MrWhite 14.12.2020 22:01

Другие вопросы по теме