12

私の目標は、特定のクエリ文字列属性とその値を「ホワイトリストに登録」して、ワニスが URL 間でキャッシュを変更しないようにすることです。

例:

Url 1: http://foo.com/someproduct.html?utm_code=google&type=hello  
Url 2: http://foo.com/someproduct.html?utm_code=yahoo&type=hello  
Url 3: http://foo.com/someproduct.html?utm_code=yahoo&type=goodbye

上記の例では、「type」ではなく「utm_code」をホワイトリストに登録したいので、最初の URL がヒットした後、ニスがそのキャッシュされたコンテンツを 2 番目の URL に提供するようにします。

ただし、3 番目の URL の場合、属性「type」の値が異なるため、varnish キャッシュ ミスになるはずです。

以下の 2 つの方法を試しましたが (現在は見つけられない drupal のヘルプ記事にあります)、うまくいきませんでした。正規表現が間違っている可能性があります。

# 1. strip out certain querystring values so varnish does not vary cache.
set req.url = regsuball(req.url, "([\?|&])utm_(campaign|content|medium|source|term)=[^&\s]*&?", "\1");
# get rid of trailing & or ?
set req.url = regsuball(req.url, "[\?|&]+$", "");

# 2. strip out certain querystring values so varnish does not vary cache.
set req.url = regsuball(req.url, "([\?|&])utm_campaign=[^&\s]*&?", "\1");
set req.url = regsuball(req.url, "([\?|&])foo_bar=[^&\s]*&?", "\1");
set req.url = regsuball(req.url, "([\?|&])bar_baz=[^&\s]*&?", "\1");
# get rid of trailing & or ?
set req.url = regsuball(req.url, "[\?|&]+$", "");
4

7 に答える 7

12

私はこれを理解し、共有したいと思いました。必要なことを行うサブルーチンを作成するこのコードを見つけました。

sub vcl_recv {

    # strip out certain querystring params that varnish should not vary cache by
    call normalize_req_url;

    # snip a bunch of other code
}

sub normalize_req_url {

    # Strip out Google Analytics campaign variables. They are only needed
    # by the javascript running on the page
    # utm_source, utm_medium, utm_campaign, gclid, ...
    if(req.url ~ "(\?|&)(gclid|cx|ie|cof|siteurl|zanpid|origin|utm_[a-z]+|mr:[A-z]+)=") {
        set req.url = regsuball(req.url, "(gclid|cx|ie|cof|siteurl|zanpid|origin|utm_[a-z]+|mr:[A-z]+)=[%.-_A-z0-9]+&?", "");
    }
    set req.url = regsub(req.url, "(\?&?)$", "");
}
于 2012-12-14T02:19:36.047 に答える
3

正規表現に問題があります。
両方の regsub 呼び出しで使用される RegEx を変更しました。

sub normalize_req_url {
    # Clean up root URL
    if (req.url ~ "^/(?:\?.*)?$") {
        set req.url = "/";
    }

    # Strip out Google Analytics campaign variables
    # They are only needed by the javascript running on the page
    # utm_source, utm_medium, utm_campaign, gclid, ...
    if (req.url ~ "(\?|&)(gclid|cx|ie|cof|siteurl|zanpid|origin|utm_[a-z]+|mr:[A-z]+)=") {
        set req.url = regsuball(req.url, "(gclid|cx|ie|cof|siteurl|zanpid|origin|utm_[a-z]+|mr:[A-z]+)=[%\._A-z0-9-]+&?", "");
    }
    set req.url = regsub(req.url, "(\?&|\?|&)$", "");
}

最初の変更は「[%._A-z0-9-]」の部分です。これは、ダッシュが範囲記号のように機能していたためです。そのため、ダッシュを最後に移動し、ドットをエスケープする必要があります。

2 番目の変更は、残りの URL の疑問符を削除するだけでなく、アンパサンドまたは疑問符とアンパサンドも削除することです。

于 2014-08-13T15:57:20.150 に答える
0

削除したいutm_codeのですが、使用している正規表現のいずれにも含まれていません。

これを試して:

# Strip out specific utm_ values from request URL query parameters
set req.url = regsuball(req.url, "([\?|&])utm_(campaign|content|medium|source|term|code)=[^&\s]*&?", "\1");
# get rid of trailing & or ?
set req.url = regsuball(req.url, "[\?|&]+$", "");

または、で始まるすべてのutm_URLパラメータを削除する場合は、次のコマンドを使用できます。

# Strip out ALL utm_ values from request URL query parameters
set req.url = regsuball(req.url, "([\?|&])utm_(\w+)=[^&\s]*&?", "\1");
# get rid of trailing & or ?
set req.url = regsuball(req.url, "[\?|&]+$", "");
于 2012-12-11T10:47:10.827 に答える