web-dev-qa-db-ja.com

VarnishVCLのGETパラメータを無視する

わかりました:開発者に公開するいくつかのAPIを含むサイトをセットアップしました。

/api/item.xml?type_ids=34,35,37&region_ids=1000002,1000003&key=SOMERANDOMALPHANUM

このURIでは、type_idsは常に設定され、region_idsとkeyはオプションです。

注意すべき重要なことは、キー変数は応答の内容に影響を与えないということです。これは、リクエストの内部追跡に使用されるため、遅いリクエストや不要なリクエストを行った人を特定できます。

ワニスには、次のようなVCLがあります。

if (req.http.Host ~ "the-site-in-question.com") {
  if (req.url ~ "^/api/.+\.xml") {
    unset req.http.cookie;
  }
}

Cookieを取り除き、時間に関する限りバックエンドに残りを任せます(Rails/authlogicはAPI応答とともにセッションCookieを送信するため、これはハックアラウンドです)。

ただし、現在、&key=SOMEALPHANUMはストレージのVarnishハッシュの一部と見なされているため、個別の開発者は基本的に異なるキャッシュにアクセスしています。これは明らかに優れた解決策ではなく、URIのその部分を無視するようにVarnishに指示する方法を見つけようとしています。

3
JamesHarrison

キャッシュから配信されない場合に備えて、key=SOMEALPHANUMをバックエンドにそのまま残す必要がある場合は、代わりにvcl_hash関数内でregsubを実行する方がよい場合がありますこのように)実際にはURLを変更しませんが、代わりにキーのハッシュを変更するだけです。

sub vcl_hash {
  if(req.http.Host ~ "the-site-in-question.com" & req.url ~ "^/api/") {
    set req.http.X-Sanitized-URL = req.url;
    set req.http.X-Sanitized-URL = regsub(req.http.X-Sanitized-URL, "&key=[A-Za-z0-9]+", "");
    set req.hash += req.http.X-Sanitized-URL;
  } else {
    set req.hash += req.url;
  }
  set req.hash += req.http.Host;
  hash;
}
5
3molo

vcl_recvで

set req.url = regsub(req.url、 "&key =。* $"、 "");

2
deleted

Cd34による回答と同様ですが、クエリパラメータの順序が異なる可能性を考慮し、問題が値を英数字として定義しているという事実に依存しています。

set req.url = regsub(req.url, "&key=[A-Za-z0-9]*", ""); 

(まだコメントできません。コメントしないと、cd34の回答に対するコメントになります)

1