在服务器上使用 Varnish 运行 访问通过网络表单中的文件字段上传的私人文件时出现问题

Problems with accessing private files uploaded via file field in a webform with Varnish running on the server

我有一个网络表单,其中的文件字段配置为私有文件。当我以超级用户 (uid=1) 身份登录并尝试下载文件时,访问被拒绝。

我正在尝试调试它,这就是我注意到的。

file_download() function that is called in the system.module. This function validates if the file exists and request the file headers using file_download_headers() function that triggers hook_file_download() 提供的所有私人文件。

webform_file_download() 函数中,模块确定文件是否为网络表单上传,并根据提交的访问权限授予或拒绝文件访问权限。它通过调用 webform_submission_access() 来验证访问权限。当我在此函数中 运行 dpm($account) 时,我在尝试访问私人文件时得到了一个匿名用户。当我浏览最近的日志消息时,我有以下条目:

access denied   06/02/2015 - 11:23  system/files/webform/cv-uploads/cv.pdf  Anonymous

当我将 URL 更改为不存在的文件时,我得到:

page not found  06/02/2015 - 11:26  system/files/webform/cv-uploads/cv.FDP  admin

正如您看到的,由于某些原因,当模块试图访问确实存在的文件时,我得到 访问被拒绝 并且用户是匿名的。当文件不存在时,我得到 找不到页面 并且用户是登录用户。

知道为什么会这样吗?

更新

我已将以下代码添加到我的 index.php 但我在尝试访问该文件时仍然得到匿名用户。

define('DRUPAL_ROOT', getcwd());

require_once DRUPAL_ROOT . '/includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);

+ global $user;
+ watchdog('user', '<pre>'. print_r($user, TRUE) . '</pre>');

menu_execute_active_handler();

我已经将整个站点(包括数据库和文件)复制到我的本地机器上,但我没有遇到这个问题。在实时站点上应该有一些设置可以做到这一点。

更新 2

我注意到在实时站点上我们有一个我不知道的禁用功能列表。也许它会有所帮助。

disable_functions = apache_child_terminate, apache_setenv, define_syslog_variables, escapeshellarg, escapeshellcmd, eval, exec, fp, fput, ftp_connect, ftp_exec, ftp_get, ftp_login, ftp_nb_fput, ftp_put, ftp_raw, ftp_rawlist, highlight_file, ini_alter, ini_get_all, ini_restore, inject_code, mysql_pconnect, passthru, php_uname, phpAds_remoteInfo, phpAds_XmlRpc, phpAds_xmlrpcDecode, phpAds_xmlrpcEncode, popen, posix_getpwuid, posix_kill, posix_mkfifo, posix_setpgid, posix_setsid, posix_setuid, posix_setuid, posix_uname, proc_close, proc_get_status, proc_nice, proc_open, proc_terminate, shell_exec, system, xmlrpc_entity_decode, parse_ini_file,show_source,shell_exec

问题是由服务器上的清漆引起的。以下是 Varnish 的设置。

# Always cache the following file types for all users. This list of extensions
# appears twice, once here and again in vcl_fetch so make sure you edit both
# and keep them equal.

if (req.url ~ "(?i)\.(pdf|asc|dat|txt|doc|xls|ppt|tgz|csv|png|gif|jpeg|jpg|ico|swf|css|js)(\?.*)?$") {
  unset req.http.Cookie;
}