Проксирование картинок в WordPress с продакшена для локальной и стейджинг среды

Когда мы поднимаем локальную или стейджинг-копию сайта на WordPress, часто возникает проблема: база данных подтянута с продакшена и ссылается на все картинки из /wp-content/uploads/, но сами файлы медиа-библиотеки не скачаны.

Решение — настроить проксирование файлов: если в локальной среде нужного файла нет, он будет автоматически подтягиваться с продакшена.

Это позволяет:

  • не хранить гигабайты картинок локально;
  • работать с актуальным контентом;
  • ускорить развёртывание окружения.

Вариант для Nginx

В конфиге локального/стейджинг сайта добавляем правило для uploads.

server {
    listen 80;
    server_name local.example.test;

    root /var/www/local.example.test;

    index index.php;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    # Проксируем картинки из uploads
    location /wp-content/uploads/ {
        root /var/www/local.example.test;

        # если файла нет — идём на продакшен
        try_files $uri @production;
    }

    location @production {
        proxy_pass <https://example.com>; # продакшен-домен
        proxy_set_header Host example.com;
    }

    location ~ \\.php$ {
        include fastcgi_params;
        fastcgi_pass unix:/run/php/php8.2-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

Как это работает:

  • try_files $uri @production; проверяет, есть ли файл локально.
  • Если нет — срабатывает @production, и Nginx качает его с продакшена.

Вариант для Apache

Для Apache есть два варианта:

  1. через .htaccess (подходит для локальной разработки),
  2. через VirtualHost в конфигурации.

1. Вариант с .htaccess

В корне сайта создаём/дополняем .htaccess:

RewriteEngine On

# Проксируем только uploads
RewriteCond %{REQUEST_URI} ^/wp-content/uploads/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ <https://example.com/$1> [P,L]

2. Вариант с VirtualHost

<VirtualHost *:80>
    ServerName local.example.test
    DocumentRoot /var/www/local.example.test

    <Directory /var/www/local.example.test>
        AllowOverride All
        Require all granted
    </Directory>

    ProxyPreserveHost On

    # Если файла нет локально — берём с продакшена
    RewriteEngine On
    RewriteCond %{REQUEST_URI} ^/wp-content/uploads/
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ <https://example.com/$1> [P,L]

    ErrorLog ${APACHE_LOG_DIR}/local-error.log
    CustomLog ${APACHE_LOG_DIR}/local-access.log combined
</VirtualHost>


Советы и нюансы

  • Лучше использовать HTTPS для проксирования, чтобы избежать проблем с mixed content.
  • Если продакшен на Cloudflare/CDN — можно проксировать напрямую к нему (будет быстрее).
  • Если хотите, чтобы файлы кэшировались локально после первого запроса, можно подключить proxy_cache (Nginx) или mod_cache (Apache).
  • Для стейджинга иногда достаточно разово синкануть uploads через rsync, но прокси даёт больше гибкости.

👉 Таким образом, и в Nginx, и в Apache можно легко организовать автоматическую подгрузку картинок с продакшена в локальное или тестовое окружение, не забивая диск и не тратя время на копирование всей медиатеки.

Фото аватара

Antony I

Веб разработчик, специализация на лучших мировых практиках: WordPress, WooCommerce, NextJS, Strapi, JAMStack ...

Основные типы проектов: CMS, eCommerce, SEO, LMS, ECM, BPM

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *