5

FosOauth2Serverbundle、FosRestBundle、および FosUserBundle を使用して Symfony2 で記述された RESTful Api があります。リバース プロキシとして API の前にワニスを配置する予定です。私のAPIを使用する私のアプリは常にパラメーターまたはヘッダーとしてaccess_tokenを送信するため、ワニスはほとんどすべてのリクエストを異なるリクエストとしてキャッシュし、効果的ではありません。セキュリティのために、また場合によってはコンテンツのためにコントローラーで access_token のユーザーを使用するため、vcl_recv の要求から access_token を完全に削除することはできません。インターネットでいくつか検索した後、認証http://www.adayinthelifeof.nl/2012/07/06/using-varnish-to-offload-and-cache-your-oauth-requests/のソリューションに出くわしました。ただし、ヘッダーで FosUserBundle の現在のユーザーに security.yml でセキュリティを渡すように指示する方法がわかりません。

  access_control:
   - { path: ^/2013-08-30/foo$, role: ROLE_USER, requires_channel: https, methods: [GET] }

要するに、リクエスト(ワニスから送信)ヘッダーでFosUserBundleの現在のユーザーにどのように伝えることができますか?

4

1 に答える 1

1

このような問題を回避するにはいくつかの方法があります。わずかに異なる 2 つのリクエストで同じレスポンスを返したい場合 (つまり、リクエストは API キーの GET パラメータのみが異なる場合)、最も迅速で簡単な解決策は、varnish の一意性の定義を次のようにカスタマイズすることです。 vcl_hash の hash_data 関数。応答を明確にすることに寄与しないすべての url 要素を取り除き、それをハッシュするだけです。たとえば、URL に「access_token」が含まれている場合、すべての GET パラメータをハッシュ キーから削除します。

sub vcl_hash {
  if (req.url ~ "access_token"){
    set req.url = regsub(req.url, "^https?://(.*)\?access_token=.*$","\1");
  }
  hash_data(req.url);
}

つまり、これは mydomain.com/some/restful/request?access_token=abc と mydomain.com/some/restful/request?access_token=def を一致としてキャッシュします。

応答がほとんど同じで、一意である必要がある小さな領域がある場合 (つまり、大きな JSON 応答の 1 つの値、または「Welcome Username!」というヘッダー内の div)、エッジ サイド インクルードを使用できます。もちろん、これにはバックエンドが返すものをカスタマイズする必要があるという問題があります。

于 2014-06-27T20:30:20.473 に答える