3

ワニスをインストールしましたが、すべて正常に動作します。

ただし、ログインしているユーザーをキャッシュする必要があります。これは私のVCLにあるものです:

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

sub vcl_recv {   
    unset req.http.Cookie;    
    if (req.http.Authorization || req.http.Cookie) {
        return (lookup);
    }
    return (lookup);
}

sub vcl_fetch {
    unset beresp.http.Set-Cookie;
    set beresp.ttl = 24h;
    return(deliver);
}

上記は機能しますが、ユーザーは他のユーザーのデータを表示できます。たとえば、Sam としてログインし、ページ A にアクセスするとします。別のユーザー (たとえば、Angie) がログインしてページ A を開くと、Sam と同じコンテンツが表示されます。

実際にそのページを表示する権限があるログイン ユーザーにページを制限する方法はありますか?

私のリクエストヘッダーは次のとおりです。

Request Headersview source
Accept  text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding gzip, deflate
Accept-Language en-US,en;q=0.5
Authorization   Basic YWRtaW46YWRtaW4=
Connection  keep-alive
Cookie  tree-s="eJzTyCkw5NLIKTDiClZ3hANXW3WuAmOuRKCECUjWFEnWIyIdJGvGlQgEegAD3hAj"; __ac="0zVm7PLtpaeQUXtm9BeYrC5%2BzobmBLPQkjRtxjyRGHs1MGY1MTgzZGFkbWluIQ%3D%3D"; 'wc.cookiecredentials'="0241d135445f7ca0b1cb7aced45da4e750f5414dadmin!"

Authorization要求ヘッダーのエントリを使用して、この制限を適用できますか?

4

2 に答える 2

3

VCL が現在行っていることは、リクエスト ヘッダーから Cookie を削除し、すべてのリクエストをキャッシュすることです。これにより、説明した正確な動作が発生します。最初のページの読み込みがキャッシュされ、後続のすべてのユーザーがキャッシュされたコンテンツを取得します-誰がリクエストを行っても。通常、ログインしていないユーザーのコンテンツのみをキャッシュする必要があります。

Varnish を使用して承認またはアクセス制御を行うことはできません。これはバックエンドで処理する必要があります。これを行うには、関連するセッション情報を含む Cookie を識別し、セッションが定義されている場合は Cookie を保持し、それ以外の場合は Cookie を削除する必要があります。

例えば:

sub vcl_recv {
  if(req.http.Cookie) {
    # Care only about SESSION_COOKIE
    if (req.http.Cookie !~ "SESSION_COOKIE" ) {
      remove req.http.Cookie;
    }
  }
}

そうすれば、「SESSION_COOKIE」Cookie を含むすべてのリクエストがバックエンドに渡されますが、ログインしていないユーザーは Varnish からキャッシュされたコピーを受け取ります。

ログインしているユーザーのキャッシュにも Varnish を使用したい場合は、Varnish の ESI featuresをご覧になることをお勧めします。

于 2013-01-16T11:43:48.893 に答える
0

vmod またはインライン C を追加して、vcl のみで実行できます。

簡単な例: 3 つの異なるレベルのユーザー (非ログイン、ログイン、管理者) 用に 3 つの異なるページがあり、そのレベルが Cookie に保存されているとします。Cookie の値を取得して、URL に get パラメータを追加できます。

http://example.com/homepage.html?user_level=none

http://example.com/homepage.html?user_level=logged_in

http://example.com/homepage.html?user_level=admin

(vmod は、「?」または「&」と名前と値のペアを URL の末尾に追加することを処理します。)

通常、これらはすべて vmod で実行されますが、サイズによってはインライン C として実行することもできます。

vcl_hash() が実行されると、変更したばかりの URL がハッシュされます。Varnish キャッシュには、最大 3 つの異なるバージョンのページが含まれるようになりました。Varnish の観点からは、これらは 3 つの異なるキャッシュ オブジェクトです。ページのバリエーションごとに異なる TTL を設定できます。

キャッシュ ミスの場合、バックエンド Web サーバーは、追加したばかりのこの get パラメータを無視するか、vcl_hash() または vcl_backend_fetch で vcl 内で削除できます。バックエンド サーバーは通常、この vcl 追加パラメーターではなく、cookie 値を使用します。

要約すると、URL パラメーターを変更して、必要なさまざまなユーザー レベルに対して異なるハッシュを行うようにします。または、代わりに vcl_hash() メソッドを変更して Cookie 値をハッシュすることもできますが、varnishncsa のログとレポートには URL を変更する方が適していることがわかりました。さらに、Cookie が暗号化されている場合、URL パラメーターを変更するだけで、基本的な cURL 要求を使用して PURGE 要求をより簡単に処理できます。PURGE 要求を送信するクライアントが許可されたユーザーである場合、PURGE 条件が処理されます。

于 2016-04-28T14:53:40.003 に答える