1

私はイントラネット スタイルのプライベート Web サイトを持っています。この Web サイトでは、コンテンツを表示する前に誰もがログインする必要があります。ログインすると、すべてのページが同じになります。そのため、これらのページを Varnish にキャッシュする必要がありますが、それでもユーザー アクセスを簡単にチェックできます。

そのため、これを行うことを考えていました。VCL ファイルに、受信した各要求を 1 つのファイルに書き換えるルールを作成します。このファイルはキャッシュされず、ユーザーが有効かどうかを確認します。有効な場合は、キャッシュされたページの esi インクルードを出力します。

これは、キャッシュされたページに対する 2 番目の要求が認証済みとして識別されることを除いて、すべて問題ありません。リクエストにクエリ文字列を追加して、それを確認することを考えていました。または、esi:include を介してリクエストが行われたかどうかを確認する方法があるかもしれません。おそらく私はこれに間違った方法でアプローチしていますか?

助言がありますか?

4

3 に答える 3

0

これが私が開発環境で試したことです。これを本番環境で使用するかどうかはまだわかりません。

ワニス構成

probe checkslash {
    .url = "/robots.txt";
    .interval = 500s;
    .timeout = 10s;
}    

include "backends.vcl";

/** generic config from here down */
sub vcl_recv{

    /* if the drupals are down, this is how long we cache for */
    set req.grace = 6h;

    /* Make sure we direct 443 traffic to the secure drupal */
    if (server.port == 443 ) {
      set req.backend = drpau_ssl_director;

   } else {
      /* port 80 traffic goes to the correct LB */
      set req.backend = drpau_director;
    }
 # just pass through non-page files, and the login page
   if (req.url ~ "(?i)\.(pdf|asc|dat|txt|doc|xls|ppt|tgz|csv|png|gif|jpeg|jpg|ico|swf|css|js|htc|ejs)(\?.*)?$") {
       } else if (req.url ~ "(?i)(sites/default/files)|(js/)|(/login)" ) { 
    } else if (req.esi_level == 0 ) {
     # pass regular pages to a spoecial url
     set req.url = "/esi" + req.url;
   }
    return (lookup);
}



sub vcl_fetch {

 if (req.url ~ "/esi/" && req.esi_level == 0 ) {
       set beresp.do_esi = true; /* Do ESI processing               */ 
    }

}

次に、Apache で、esi プレフィックスを介して来るページのすべてのリクエストをリダイレクトします

RewriteRule ^esi/(.*)$ test.php [L]

テストphpは

<?php 
define('DRUPAL_ROOT', getcwd());
// We prepare only a minimal bootstrap.
require_once DRUPAL_ROOT . '/includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_SESSION);
global $user;
$roles = user_roles();

if (in_array('anonymous user', $user->roles)) {
  $uri = preg_replace('#^/esi#', '', $_SERVER[REQUEST_URI]);
  echo "<esi:include src=\"http://$_SERVER[SERVER_NAME]$uri\"/>";
} else {
    header("Location: https://$_SERVER[SERVER_NAME]/login");
}
于 2013-10-15T20:01:16.063 に答える