Я работаю с партнером, который предоставляет мне изображения своих продуктов через 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
? Это осуществимо? Будут ли они все равно не отображаться, потому что они размещены удаленно?
Перенаправление не обманет блокировщик рекламы. Если вы действительно настаиваете на том, чтобы попытаться быть умным и нарушить четкую волю пользователя (так, если вы хотите расстроить и раздражать пользователя), вам нужно будет проксировать запросы. Что добавит нагрузку на вашу установку. Мой совет: никогда не пытайтесь быть умнее своих пользователей. Если они не хотят видеть эти изображения, не заставляйте их.
@arkascha вы, вероятно, правы, и в целом я согласен с мнением, но на самом деле это не реклама, это изображения продуктов на странице, полной информации о продуктах. В именах файлов есть слово «реклама» в путях, поэтому блокировщики рекламы не позволяют им появляться.
Звучит подозрительно, извините. Блокировщики рекламы не реагируют на части «пути», они контролируют, из каких источников загружаются дополнительные ресурсы и какова связь между фактической страницей и этими источниками. Выше я рассказал вам единственный способ обойти это, который вы видимо не читали.
Да, ты прав. Я просто настроил задание cron для ежедневной загрузки изображений и их локального размещения.
Но блокировщики рекламы смотрят на имена файлов и пути. Только изображения со словом «реклама» в пути и имени файла блокировались ABP.
Можно ли настроить перенаправление, чтобы тег 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, который извлекает изображение с удаленного сервера и отправляет его обратно в ответ.
Например, в .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);
О, это кажется хорошим способом сделать это! Я попробую это.
Я обновил свой ответ, включив в него пример PHP-скрипта для извлечения удаленного изображения.
«Они все равно не появятся, потому что они размещены удаленно?» - Что ты имеешь в виду? Я полагаю, что большинство объявлений размещаются «удаленно».