使用wordpress的清漆打破wordpress可视化编辑器?

时间:2013-08-17 07:53:04

标签: wordpress ubuntu varnish

嗨我在Wordpress 3.5 Varnish 3.02和Ubuntu上有一个非常奇怪的问题,可视化编辑器已经消失了。在html / visual之间切换的按钮消失了,只显示了html编辑器。该网站缓存正常,没有javascript错误,并且在apache日志中没有错误。 Varnish正在80和8080上听Apache。除了编辑器,其他一切都很好。 当我绕过清漆时,编辑器开关按钮出现并正常工作。以下是我迄今为止所取得的成就: - 禁用所有插件 - 切换到默认主题 - 检查firebug是否有任何jquery错误(NONE) - Bypassed Varnish(一切正常) - 清除清漆缓存(没有运气) - 重新上传所有默认的wordpress文件 - 切换到早期版本的Wordpress(3.5) 您认为可能是什么问题?在这个问题上,我一直在摸不着头脑。

VCL文件

 backend default {
    .host = "x.x.x.x";
    .port = "8080";
 }


 sub vcl_recv {

  if (req.http.host ~ "mydomain.com") {
    set req.http.x-Redir-Url = "http://www.anotherdomain.com/specific_folder/";
    error 750 req.http.x-Redir-Url;
  }

 }

include "devicedetect.vcl";

# Called after a document has been successfully retrieved from the backend.
sub vcl_recv {
    call devicedetect;


    # Allow the back-end to serve up stale content if it is responding slowly.
    set req.grace = 2m;

    # Always cache the following file types for all users.
    if ( req.url ~ "(?i)\.(png|gif|jpeg|jpg|ico|swf|css|js|html|htm)(\?[a-z0-9]+)?$" ) {
            unset req.http.cookie;
    }

    # Don't serve cached pages to logged in users
    if ( req.http.cookie ~ "wordpress_logged_in" || req.url ~ "vaultpress=true" ) {
            return( pass );
    }

    # Drop any cookies sent to WordPress.
    if ( ! ( req.url ~ "wp-(login|admin)" ) ) {
            unset req.http.cookie;
    }

    # Handle compression correctly. Different browsers send different
    # "Accept-Encoding" headers, even though they mostly all support the same
    # compression mechanisms. By consolidating these compression headers into
    # a consistent format, we can reduce the size of the cache and get more hits.
    # @see: http://varnish.projects.linpro.no/wiki/FAQ/Compression
    if ( req.http.Accept-Encoding ) {

            if ( req.http.Accept-Encoding ~ "gzip" ) {
                    # If the browser supports it, we'll use gzip.
                    set req.http.Accept-Encoding = "gzip";
            }

            else if ( req.http.Accept-Encoding ~ "deflate" ) {
                    # Next, try deflate if it is supported.
                    sset req.http.Accept-Encoding = "deflate";
            }
            else {
                    # Unknown algorithm. Remove it and send unencoded.
                    unset req.http.Accept-Encoding;
            }

    }

}

# MOBILE AND UA DETECTION - override the header before it is sent to the backend
sub vcl_miss { if (req.http.X-UA-Device) { set bereq.http.User-Agent = req.http.X-UA-Device; } }
sub vcl_pass { if (req.http.X-UA-Device) { set bereq.http.User-Agent = req.http.X-UA-Device; } }


sub vcl_fetch {
    #SET UA BEFORE SENDING TO BACKEND
    if (req.http.X-UA-Device) {
            if (!beresp.http.Vary) { # no Vary at all
                    set beresp.http.Vary = "X-UA-Device";
            } elseif (beresp.http.Vary !~ "X-UA-Device") { # add to existing Vary
                    set beresp.http.Vary = beresp.http.Vary + ", X-UA-Device";
            }
    }
    set beresp.http.X-UA-Device = req.http.X-UA-Device;



    #Fix Login under wordpress
    if (beresp.http.set-cookie ~ "sessionid" || beresp.http.set-cookie ~ "csrftoken") {
    #       return (pass);
    } else {
            return (deliver);
    }

    set beresp.ttl = 20m;

    # Allow items to be stale if needed.
    set beresp.grace = 2m;

    # Drop any cookies WordPress tries to send back to the client.
    if ( ! req.url ~ "wp-(login|admin)" && ! req.http.cookie ~ "wordpress_logged_in" ) {
            unset beresp.http.set-cookie;
    }

}

sub vcl_error {
 #REDIRECTION
    if (obj.status == 750) {
            set obj.http.Location = obj.response;
            set obj.status = 301;
            return (deliver);
    }

set obj.http.Content-Type = "text/html; charset=utf-8";
set obj.http.Retry-After = "5";
synthetic {"
    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html>
    <head>
    <title>OOPS UNE ERREUR S'EST PRODUITE</title>
    <style src="css/style.css"></style>
    </head>
    <body>
    <h1>Oh! Oh! Nos excuses. Une erreure s'est produite. On s'en occupe.</h1>
    </body>
    </html>
"};
    return (deliver);
}

sub vcl_deliver {
  if ((req.http.X-UA-Device) && (resp.http.Vary)) {
    set resp.http.Vary = regsub(resp.http.Vary, "X-UA-Device", "User-Agent");
  }
}


**************THIS IS ANOTHER FILE(devicedetect.vcl)**********************

INCLUDED DEVICE DETECTION:

#
# detectdevice.vcl - regex based device detection for Varnish
# http://github.com/varnish/varnish-devicedetect/
#
# Author: Lasse Karstensen <lasse@varnish-software.com>

sub devicedetect {
    unset req.http.X-UA-Device;
    set req.http.X-UA-Device = "pc";

    # Handle that a cookie may override the detection alltogether.
    if (req.http.Cookie ~ "(?i)X-UA-Device-force") {
            /* ;?? means zero or one ;, non-greedy to match the first. */
            set req.http.X-UA-Device = regsub(req.http.Cookie, "(?i).*X-UA-Device-force=([^;]+);??.*", "\1");
            /* Clean up our mess in the cookie header */
            set req.http.Cookie = regsuball(req.http.Cookie, "(^|; ) *X-UA-Device-force=[^;]+;? *", "\1");
            /* If the cookie header is now empty, or just whitespace, unset it. */
            if (req.http.Cookie ~ "^ *$") { unset req.http.Cookie; }
    } else {
            if (req.http.User-Agent ~ "(?i)(ads|google|bing|msn|yandex|baidu|ro|career|)bot" ||
                req.http.User-Agent ~ "(?i)(baidu|jike|symantec)spider" ||
                req.http.User-Agent ~ "(?i)scanner" ||
                req.http.User-Agent ~ "(?i)(web)crawler") {
                    set req.http.X-UA-Device = "bot"; }
            elsif (req.http.User-Agent ~ "(?i)ipad")        { set req.http.X-UA-Device = "tablet-ipad"; }
            elsif (req.http.User-Agent ~ "(?i)ip(hone|od)") { set req.http.X-UA-Device = "mobile-iphone"; }
            /* how do we differ between an android phone and an android tablet?
               http://stackoverflow.com/questions/5341637/how-do-detect-android-tablets-in-general-useragent */
            elsif (req.http.User-Agent ~ "(?i)android.*(mobile|mini)") { set req.http.X-UA-Device = "mobile-android"; }
            // android 3/honeycomb was just about tablet-only, and any phones will probably handle a bigger page layout.
            elsif (req.http.User-Agent ~ "(?i)android 3")              { set req.http.X-UA-Device = "tablet-android"; }
            // May very well give false positives towards android tablets. Suggestions welcome.
            elsif (req.http.User-Agent ~ "(?i)android")         { set req.http.X-UA-Device = "tablet-android"; }
            elsif (req.http.User-Agent ~ "Mobile.+Firefox")     { set req.http.X-UA-Device = "mobile-firefoxos"; }
            elsif (req.http.User-Agent ~ "^HTC" ||
                req.http.User-Agent ~ "Fennec" ||
                req.http.User-Agent ~ "IEMobile" ||
                req.http.User-Agent ~ "BlackBerry" ||
                req.http.User-Agent ~ "SymbianOS.*AppleWebKit" ||
                req.http.User-Agent ~ "Opera Mobi") {
                    set req.http.X-UA-Device = "mobile-smartphone";
            }
            elsif (req.http.User-Agent ~ "(?i)symbian" ||
                req.http.User-Agent ~ "(?i)^sonyericsson" ||
                req.http.User-Agent ~ "(?i)^nokia" ||
                req.http.User-Agent ~ "(?i)^samsung" ||
                req.http.User-Agent ~ "(?i)^lg" ||
                req.http.User-Agent ~ "(?i)bada" ||
                req.http.User-Agent ~ "(?i)blazer" ||
                req.http.User-Agent ~ "(?i)cellphone" ||
                req.http.User-Agent ~ "(?i)iemobile" ||
                req.http.User-Agent ~ "(?i)midp-2.0" ||
                req.http.User-Agent ~ "(?i)u990" ||
                req.http.User-Agent ~ "(?i)netfront" ||
                req.http.User-Agent ~ "(?i)opera mini" ||
                req.http.User-Agent ~ "(?i)palm" ||
                req.http.User-Agent ~ "(?i)nintendo wii" ||
                req.http.User-Agent ~ "(?i)playstation portable" ||
                req.http.User-Agent ~ "(?i)portalmmm" ||
                req.http.User-Agent ~ "(?i)proxinet" ||
                req.http.User-Agent ~ "(?i)sonyericsson" ||
                req.http.User-Agent ~ "(?i)symbian" ||
                req.http.User-Agent ~ "(?i)windows\ ?ce" ||
                req.http.User-Agent ~ "(?i)winwap" ||
                req.http.User-Agent ~ "(?i)eudoraweb" ||
                req.http.User-Agent ~ "(?i)htc" ||
                req.http.User-Agent ~ "(?i)240x320" ||
                req.http.User-Agent ~ "(?i)avantgo") {
                    set req.http.X-UA-Device = "mobile-generic";
            }
    }

}

2 个答案:

答案 0 :(得分:3)

在遇到同样的问题时,我偶然发现了这个问题。我试着按照提问者在后续“回复”中提出的建议,但我运气不好。

问题中描述的问题源于Wordpress仅在用户代理与已知用户代理匹配时启用TinyMCE(可视)编辑器的事实。对于其他一切,它将默认禁用它。结合devicedetect.vcl,你可以看到它的发展方向......

所以,因为我们正在向后端(Wordpress)发送“pc”,“mobile-platform”等,它实际上永远不会知道你正在使用的浏览器。

在我的VCL中,我使用以下代码完全禁用/ wp-admin的缓存:

if (req.url ~ "/wp-(login|admin)") {
    return (pass);
}

当我实施devicedetect.vcl时,我在sub vcl_recv的顶部调用例程,因此用户代理已经在修改后的状态下到达我的后端。

解决方法是在return (pass) 之前/wp-(login|admin) {/ 1>} call devicedetectif (req.url ~ "/wp-(login|admin)") { return (pass); } call devicedetect; ,如下所示:

setTimeout

答案 1 :(得分:2)

是的,无论是否登录,都会发生这种情况。

问题在于vcl_recv中对devicedetect的调用。我在第一个处理devicedetect例程之后创建了一个新的vcl_recv。这以某种方式解决了这个问题。

由于