我在nginx前面添加了Varnish。 当我尝试login到WordPress,我去domain.com/wp-admin,但我现在redirect到domain.com:8080/wp-admin。 我可以手动删除端口和pipe理端function的方式。
我的清漆configuration:
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); } }
我认为你错了,redirect只会追加端口,而不会在URL的末尾添加一个斜杠。
在遇到这个问题之后,很明显的是这个内部redirect是由nginx在遇到一个没有结尾斜杠的访问目录时完成的。
您可以使用http://nginx.org/en/docs/http/ngx_http_core_module.html#port_in_redirect禁用端口被追加:
port_in_redirect off;
只要不直接在端口8080上访问nginx,只要不依赖这种redirect,只要Host名在varnish和nginx之间匹配,这个解决scheme就可以工作得很好。
不知道这是什么说这个作者“说谎”,因为说谎是“做一个不真实的声明,意图欺骗”。 作者显然不是想欺骗用户,他只是没有意识到这是一个正斜杠的工作,最终人们只是想知道如何使它的工作没有一个正斜杠。
为了解决这个问题,我build议把下面的内容添加到你的nginx服务器块中:
rewrite /wp-admin$ $scheme://$host$uri/ permanent;
这是当你去example.com/wp-admin它将去example.com/wp-admin,而不是去example.com:8080/wp-admin/,如果你在CloudFlare的DNS例如它会说该网站已closures。
我使用的是Ubuntu,Nginx和Varnish,现在完全可以工作,而不是禁用port_in_redirect。
要添加,请确保在以下情况下重新启动nginx:
sudo service nginx restart
在“设置 – >常规”中,将“WordPress地址(URL)”设置为“ http://yourdomain.com:80/ ”
更新:我发现这个解决scheme实际上只适用于最基本的场景。 任何types的caching或CDN插件,看起来这个variables将追加“:80” – 造成各种各样的时髦问题。 最后,我只是把我的客户端指向“/wp-login.php”。 ;)