安装 Varnish 后将端口号添加到 WordPress 管理员

安装 Varnish 后将端口号添加到 WordPress 管理员

我在 nginx 前面添加了 Varnish。当我尝试登录 WordPress 时,我转到 domain.com/wp-admin,但现在我被重定向到 domain.com:8080/wp-admin。我可以手动删除端口,管理端可以正常运行。

我的 Varnish 配置:

backend origin {
    .host = "localhost";
    .port = "8080";
    .connect_timeout = 60s;
    .first_byte_timeout = 60s;
    .between_bytes_timeout = 60s;
}
acl purge {
    "localhost";
}
sub vcl_recv {
    set req.backend = origin;
    set req.http.X-Forwarded-For = client.ip;
    if(req.url ~ "^/wp-(login|admin)" || req.http.Cookie ~ "wordpress_logged_in_") {
        return (pass);
    }
    if(req.url ~ "/xmlrpc.php") {
        return(pass);
    }
    if( req.url ~ "\?s=" ){
        return (pass);
    }
    if (req.request == "BAN") {
        if(!client.ip ~ purge) {
            error 405 "Not allowed.";
        }
        ban("req.url ~ "+req.url+" && req.http.host == "+req.http.host);
        error 200 "Banned.";
    }
    if (req.request != "GET" && req.request != "HEAD" && req.request != "PUT" && req.request != "POST" && req.request != "TRACE" && req.request != "OPTIONS" && req.request != "DELETE") {
        return (pipe);
    }
    if (req.request != "GET" && req.request != "HEAD") {
        return (pass);
    }
    unset req.http.Cookie;
    return (lookup);
}
sub vcl_hit {
    if (req.request == "PURGE") { purge; }
    return (deliver);
}
sub vcl_miss {
    if (req.request == "PURGE") { purge; }
    return (fetch);
}
sub vcl_fetch {
    unset beresp.http.Server;
    unset beresp.http.X-Powered-By;
    if (beresp.status == 404) {
        set beresp.ttl = 0m;
    return(hit_for_pass);
    }
    if( beresp.http.Set-Cookie && req.url !~ "^/wp-(login|admin)" ){
        unset beresp.http.Set-Cookie;
    }
    if ( req.request == "POST" || req.http.Authorization ) {
        return (hit_for_pass);
    }
    if ( beresp.status != 200 ) {
        return (hit_for_pass);
    }
    if( req.url ~ "\?s=" ){
        return (hit_for_pass);
    }
    set beresp.ttl = 5m;
    return (deliver);
}
sub vcl_deliver {
    if (obj.hits > 0) {
        set resp.http.X-Cache = "HIT";
    } else {
        set resp.http.X-Cache = "MISS";
    }
    unset resp.http.Via;
    unset resp.http.X-Varnish;
}
sub vcl_error {
    if (obj.status == 503 && req.restarts < 2) {
        set obj.http.X-Restarts = req.restarts;
        return(restart);
    }
    if (obj.status == 301) {
        set obj.http.Location = req.url;
        set obj.status = 301;
        return(deliver);
    }
    if (obj.status == 750) {
        set obj.http.Location = obj.response;
        set obj.status = 302;
        return (deliver);
    }
}

答案1

我认为你错了,重定向只附加了端口,而没有在 URL 末尾添加斜杠。

发现该问题后,很明显这是一个内部重定向,当 nginx 遇到访问目录时没有尾随斜杠时会执行此操作。

你会使用http://nginx.org/en/docs/http/ngx_http_core_module.html#port_in_redirect禁止附加端口:

port_in_redirect off;

只要您在尝试直接通过端口 8080 访问 nginx 时不依赖此类重定向,并且只要Hostvarnish 和 nginx 之间的名称匹配,此解决方案就会很好地发挥作用。

答案2

不确定所有这些关于作者“撒谎”的说法,因为撒谎就是“故意做出不真实的陈述以欺骗”。作者显然不是有意欺骗用户,而是他只是没有意识到它可以与正斜杠一起使用,最终用户只是想知道如何在没有正斜杠的情况下使其正常工作。

为了解决这个问题,我建议将以下内容添加到您的 nginx 服务器块中:

rewrite /wp-admin$ $scheme://$host$uri/ permanent;

当您访问 example.com/wp-admin 时,它将转到 example.com/wp-admin 而不是 example.com:8080/wp-admin/,如果您使用 CloudFlare DNS,它会说该网站已关闭。

我正在使用 Ubuntu、Nginx 和 Varnish,现在这些功能运行良好,而不是禁用 port_in_redirect。

另外,请确保在之后重新启动 nginx:

sudo service nginx restart

答案3

在“设置 -> 常规”中,将“WordPress 地址 (URL)”设置为“http://yourdomain.com:80/

更新:我发现这个解决方案实际上只在最基本的场景中有效。任何查找此变量的缓存或 CDN 插件都会附加“:80”——从而导致各种奇怪的问题。最后,我只是让我的客户端指向“/wp-login.php”。;)

相关内容