わかりました:開発者に公開するいくつかのAPIを含むサイトをセットアップしました。
/api/item.xml?type_ids=34,35,37®ion_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に指示する方法を見つけようとしています。
キャッシュから配信されない場合に備えて、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;
}
vcl_recvで
set req.url = regsub(req.url、 "&key =。* $"、 "");
Cd34による回答と同様ですが、クエリパラメータの順序が異なる可能性を考慮し、問題が値を英数字として定義しているという事実に依存しています。
set req.url = regsub(req.url, "&key=[A-Za-z0-9]*", "");
(まだコメントできません。コメントしないと、cd34の回答に対するコメントになります)