Varnish + NGINX: использование Wordpress в domain.tld/blog как отдельного внутреннего сервера, а не в блоке местоположения

Varnish + NGINX: использование Wordpress в domain.tld/blog как отдельного внутреннего сервера, а не в блоке местоположения

Я хочу обслуживать бэкенд WordPress NGINX каждый раз, когда пользователь посещает www.domain.tld/blog. Я знаю, что могу использовать разные бэкенды с Varnish, например так:

sub vcl_recv {
    if (req.url ~ "^/blog/") {
        set req.backend_hint = wordpress;
    } else {
        set req.backend_hint = default;
    }
}

Я знаю, что я мог бы использовать отдельный location ^~ /blog {}в NGINX, но это имеет следующий недостаток: если я использую www.domain.tld/blogв wordpress WP_HOMEи WP_SITEURLпеременные, некоторые плагины работают некорректно. Поэтому мне нужно предоставить wordpress без завершающего символа /blogв конце как отдельный vhost.

Итак, чего я на самом деле хочу добиться:

User -> www.domain.tld/blog (Varnish) -> blog.domain.tld (Wordpress NGINX)

Главное, чтобы контент blog.domain.tld/some-postотображался как www.domain.tld/blog/some-post. Но blog.domain.tldблог не должен быть доступен публично, так как это будет означать дублирование контента.

Итак, как я могу blog.domain.tld/some-post«решить» www.domain.tld/blog/some-postс помощью Varnish и NGINX и одновременно сделать blog.domain.tldне доступным для всего мира?

Надеюсь, это было понятно :)

PS: Мне это не обязательно использовать blog.domain.tld— это просто пример, это может быть и 127.0.0.1:8008vhost, неважно.

решение1

Следующий фрагмент vcl_recvпредоставит вам то, что вам нужно, переписав URL-адрес, который увидит бэкэнд:

if (req.http.host == 'domain.tld' || req.http.host == 'www.domain.tld') {
  set req.url = regsub(req.url, "^/blog/", "/");
} 

Однако я не понимаю, что это за плагины и почему их следует терпеть :)

Связанный контент