這是我在開發環境中嘗試過的,我不確定我們是否會在生產中使用它。
光油配置
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");
}
謝謝,這是好的瞭解req.esi_level。如果你使用esi來做其他事情,會不會有另外一個警告呢? –
我結束了與基於此解決方案:http://joshwaihi.com/content/authenticated-page-caching-varnish-drupal其中的請求被轉移到另一個未緩存的網址,並返回一個頭,確定認證。該請求然後在vcl內重新啓動,頁面可以從緩存中提供。 –
這不會「破壞」其他任何東西,因爲只有當客戶端直接請求/ private/*時纔會進行干預 - 這是您聲稱您試圖阻止的內容。所有其他場景將不匹配if語句。如果您的業務規則更復雜,則需要更新VCL以匹配。我很高興你找到了另一種解決方案,但對於你正在嘗試做的事情來說,它看起來相當複雜。 –