🧑💻 Чужой плагин можно развернуть на свой сервер, не трогая его код
На двух сайтах у меня картинки жмёт Robin Image Optimizer. В какой-то момент он перестал доставать до своего API. Плагин стоит, настроен, в админке ошибка, конвертации нет.
Варианты, которые приходят в голову первыми, все плохие:
🟣 форкать чужой плагин: боль на каждом обновлении
🟣 менять оптимизатор: половина библиотеки уже обработана, статистика поедет
🟣 писать в поддержку и ждать
Я сделал четвёртое. И оно работает с любым плагином, а не только с этим.
🌟 Штука, про которую забывают
WordPress гоняет все исходящие запросы через свой HTTP API. А там есть фильтр pre_http_request, который срабатывает ДО отправки запроса.
Это значит: ты перехватываешь чужой запрос и выполняешь его сам. По другому адресу. Плагин об этом не узнает.
add_filter('pre_http_request', function($preempt, $args, $url) {
if (strpos($url, 'dashboard.robinoptimizer.com') === false) {
return $preempt;
}
$url = str_replace('https://dashboard.robinoptimizer.com', MY_PROXY, $url);
return wp_remote_request($url, $args);
}, 10, 3);
Дальше на VPS, с которого API доступно, поднимаешь обратный прокси на nginx. И там есть деталь, ради которой всё и затевалось:
➖ proxy_set_header X-Forwarded-For "";
➖ proxy_set_header X-Real-IP "";
Почти все мануалы по nginx учат ровно наоборот: прокидывай реальный IP клиента. Здесь это убило бы смысл целиком. Заголовки надо стирать.
🌟 Что ещё пришлось подменить
Одного адреса мало. Бесплатный тариф отдаёт JSON со ссылкой на готовый файл, и ссылка эта ведёт на исходный домен. Не перепишешь её в ответе, плагин пойдёт качать напрямую и снова упрётся в стену.
Итого мост подменяет три вещи: адрес запроса, ссылки в теле ответа, проверку сертификата (если он самоподписанный).
🌟 Грабли, на которых я посидел
Секретный путь прокси светится в логах самого оптимизатора открытым текстом. То есть он лежит в бэкапах сайта. Кто получил бэкап, получил твой прокси. Закрывай его по IP через allow/deny, а не одним секретным путём.
И за сутки на открытый порт прилетает больше сотни запросов от сканеров. Находят быстро.
🔗 Код и конфиг nginx: github.com/boris0024/robin-proxy-bridge
Хост API там вынесен в фильтр. Меняешь одну строчку, и мост работает для любого другого сервиса, до которого твой сервер не достаёт.
Подробный разбор с конфигом nginx целиком, разбором почему не подходит встроенный WP_PROXY_HOST и граблями, на которых я посидел: в статье на vc.ru
#WordPress@robotseo #nginx@robotseo #SEO@robotseo #автоматизация@robotseo