在服务器上使用 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;
}
我有一个网络表单,其中的文件字段配置为私有文件。当我以超级用户 (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;
}