访问通过服务器上运行的Varnish的webform中的文件字段上载的私有文件的问题

时间:2015-02-06 12:19:02

标签: drupal-7 varnish drupal-webform

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

我试图调试这个,这就是我注意到的。

由system.module中调用的file_download()函数提供的所有私有文件。此函数验证文件是否存在,并使用触发file_download_headers()hook_file_download()函数请求文件头。

webform_file_download()函数中,模块根据对提交的访问权限确定文件是否为webform上载并授予或拒绝文件访问权限。它通过调用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

1 个答案:

答案 0 :(得分:0)

问题是由服务器上的Varnish引起的。以下是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;
}