Wordpress Pemalinks не работает с Varnish - PullRequest
0 голосов
/ 10 февраля 2020

Я установил Varni sh в Docker образе, используя Plesk CPanel на веб-сайте WordPress с включенными симпатичными постоянными ссылками. Я использовал это руководство:

https://www.plesk.com/blog/product-technology/varnish-wordpress-docker-container/

Когда я нажимаю на любую ссылку на статью или категорию, меня перенаправляют обратно на домашнюю страницу со вставленным знаком вопроса и остальная часть URL. ie

https://example.com/?news / встреча мировых лидеров /

вместо

https://example.com/news/world-leaders-to-meet/

Все отлично работает, когда я отключаю Varni sh. Я даже пытался клонировать веб-сайт на поддомен, и постоянные ссылки работают на поддомене с включенной Varni sh. Я отключил плагины, и это не имеет значения.

Что я должен сделать, чтобы решить проблему?

Содержимое default.vcl (с поддельным IP-адресом для хоста)



    vcl 4.0;
    import std;

    # MAIN CONFIGURATION
    backend default {
        .host = "123.123.123.123";
        .port = "7080";
    }

    # ALLOWED IP OF PURGE REQUESTS
    acl purge {
      "localhost";
      "127.0.0.1";
      "172.17.0.1";
      "172.17.0.2";
      "123.123.123.123";
    }

    #THE RECV FUNCTION
    # Happens before we check if we have this in cache already
    sub vcl_recv {

        # SET REALIP BY TRIMMING CLOUDFLARE IP WHICH WILL BE USED FOR VARIOUS CHECKS
        set req.http.X-Actual-IP = regsub(req.http.X-Forwarded-For, "[, ].*$", ""); 

        # FORWARD THE IP OF THE REQUEST
        if (req.restarts == 0) {
            if (req.http.x-forwarded-for) {
            set req.http.X-Forwarded-For =
            req.http.X-Forwarded-For + ", " + client.ip;
            } else {
            set req.http.X-Forwarded-For = client.ip;
            }
        }

        # Purge request check sections for hash_always_miss, purge and ban
        # BLOCK IF NOT IP is not in purge acl
        # Enable smart refreshing using hash_always_miss
        if (req.http.Cache-Control ~ "no-cache") {
            if (client.ip ~ purge || !std.ip(req.http.X-Actual-IP, "1.2.3.4") ~ purge) {
                set req.hash_always_miss = true;
            }
        }

        if (req.method == "PURGE") {
            if (!client.ip ~ purge || !std.ip(req.http.X-Actual-IP, "1.2.3.4") ~ purge) {
                return(synth(405,"Not allowed."));
                }
            return (purge);
        }

        if (req.method == "BAN") {
                # Same ACL check as above:
                if (!client.ip ~ purge || !std.ip(req.http.X-Actual-IP, "1.2.3.4") ~ purge) {
                                return(synth(403, "Not allowed."));
                }
                ban("req.http.host == " + req.http.host +
                        " && req.url == " + req.url);

                # Throw a synthetic page so the
                # request won't go to the backend.
                return(synth(200, "Ban added"));
        }

        # UNSET CLOUDFLARE COOKIES
        # Remove has_js and CloudFlare/Google Analytics __* cookies.
            set req.http.Cookie = regsuball(req.http.Cookie, "(^|;\s*)(_[_a-z]+|has_js)=[^;]*", "");
            # Remove a ";" prefix, if present.
            set req.http.Cookie = regsub(req.http.Cookie, "^;\s*", "");

        # For Testing: If you want to test with Varnish passing (not caching) uncomment
        # return( pass );

        # DO NOT CACHE RSS FEED
        if (req.url ~ "/feed(/)?") {
        return ( pass ); 
        }

        # PASS WP-CRON
        if (req.url ~ "wp-cron\.php.*") {
        return ( pass );
        }

        # DO NOT CACHE POST AND EDIT PAGES
        if (req.url ~ "(wp-admin|post\.php|edit\.php|wp-login)") {
            return(pass);
        }

        # DO NOT CACHE SEARCH RESULTS
        if (req.url ~ "/\?s\=") {
        return ( pass ); 
        }

        # CLEAN UP THE ENCODING HEADER.
        # SET TO GZIP, DEFLATE, OR REMOVE ENTIRELY.  WITH VARY ACCEPT-ENCODING
        # VARNISH WILL CREATE SEPARATE CACHES FOR EACH
        # DO NOT ACCEPT-ENCODING IMAGES, ZIPPED FILES, AUDIO, ETC.
        if (req.http.Accept-Encoding) {
            if (req.url ~ "\.(jpg|png|gif|gz|tgz|bz2|tbz|mp3|ogg)$") {
            # No point in compressing these
            unset req.http.Accept-Encoding;
            } elsif (req.http.Accept-Encoding ~ "gzip") {
            set req.http.Accept-Encoding = "gzip";
            } elsif (req.http.Accept-Encoding ~ "deflate") {
            set req.http.Accept-Encoding = "deflate";
            } else {
            # unknown algorithm
            unset req.http.Accept-Encoding;
            }
        }

        # PIPE ALL NON-STANDARD REQUESTS
        if (req.method != "GET" &&
            req.method != "HEAD" &&
            req.method != "PUT" && 
            req.method != "POST" &&
            req.method != "TRACE" &&
            req.method != "OPTIONS" &&
            req.method != "DELETE") {
            return (pipe);
        }

        # ONLY CACHE GET AND HEAD REQUESTS
        if (req.method != "GET" && req.method != "HEAD") {
            return (pass);
        }

        # DO NOT CACHE LOGGED IN USERS (THIS OCCURS IN FETCH TOO)
        if ( req.http.cookie ~ "wordpress_logged_in|resetpass" ) {
            return (pass);
        }

        # FIX CLOUDFLARE MIXED CONTENT WITH FLEXIBLE SSL
        if (req.http.X-Forwarded-Proto) {
            return (hash);
        }

        # IF THE REQUEST IS NOT FOR A PREVIEW, WP-ADMIN OR WP-LOGIN THEN UNSET THE COOKIES
        if (!(req.url ~ "wp-(login|admin)") && !(req.url ~ "&preview=true" )) {
            unset req.http.cookie;
        }

        # IF BASIC AUTH IS ON THEN DO NOT CACHE
        if (req.http.Authorization || req.http.Cookie) {
            return (pass);
        }

        # IF YOU GET HERE THEN THIS REQUEST SHOULD BE CACHED
        return (hash);
        # This is for phpmyadmin
        if (req.http.Host == "pmadomain.com") {
        return (pass);
        }

        # STRIP OUT URL PARAMETERS THAT LEAD TO MULTIPLE REDUNDANT CACHING
        if (req.url ~ "(\?|&)(gclid|utm_[a-z]+)=") {
        set req.url = regsuball(req.url, "(gclid|utm_[a-z]+)=[-_A-z0-9+()%.]+&?", "");
        set req.url = regsub(req.url, "[?|&]+$", "");
        }
    }

    sub vcl_hash {
        if (req.http.X-Forwarded-Proto) {
            hash_data(req.http.X-Forwarded-Proto);
            }
        }

    # HIT FUNCTION
    sub vcl_hit {
      return (deliver);
    }

    # MISS FUNCTION
    sub vcl_miss {
      return (fetch);
    }

    # FETCH FUNCTION
    sub vcl_backend_response {
        # IF NOT WP-ADMIN THEN UNSET COOKIES AND SET THE AMOUNT OF TIME THIS PAGE WILL STAY CACHED (TTL)
        if (!(bereq.url ~ "wp-(login|admin)") && !bereq.http.cookie ~ "wordpress_logged_in|resetpass" ) {
            unset beresp.http.set-cookie;
            set beresp.ttl = 1w;
            set beresp.grace = 3d;
        }

        if (beresp.ttl  0) {
             # IF THIS PAGE IS ALREADY CACHED THEN RETURN A 'HIT' TEXT
            set resp.http.X-Cache = "HIT";
        } else {
            # IF THIS IS A MISS RETURN THAT IN THE HEADER
            set resp.http.X-Cache = "MISS";
        }
    }

1 Ответ

0 голосов
/ 17 февраля 2020

Ваш VCL код выглядит довольно просто git. Я предполагаю, что это может быть логин перезаписи URL c в вашем веб-сервере (Apache или Nginx), или, возможно, даже WordPress, который делает это перенаправление.

Выход Varnishlog

Самый простой способ выяснить это - запустить varnishlog во время возникновения проблемы. Не стесняйтесь публиковать отредактированную запись вывода varnishlog.

Если вам нужна помощь по работе с Varnishlog, посмотрите следующее сообщение в блоге, которое я написал пару лет a go: https://feryn.eu/blog/varnishlog-measure-varnish-cache-performance/.

Недостаточная осведомленность о SSL

Другая возможность заключается в том, что WordPress не знает о том факте, что обратный кеширующий HTTP-прокси-сервер находится впереди, если он.

Varni sh в настоящее время не предлагает встроенную поддержку SSL / TLS , поэтому необходимо прекратить SSL и взаимодействие между Varni sh и WordPress происходит по обычному HTTP.

Если WordPress если вы настроите автоматическое перенаправление простых HTTP-запросов в HTTPS-запрос, вы можете в конечном итоге набрать al oop.

Если это так, пожалуйста, посмотрите следующее сообщение в блоге, о котором я писал: https://feryn.eu/blog/mixed-content-and-err-too-many-redirects-in-wordpress/

...