【问题标题】:Private files in a DDEV Drupal environmentDDEV Drupal 环境中的私有文件
【发布时间】:2020-10-15 10:56:26
【问题描述】:

这里有些神秘:我正在使用 Docker 和 DDEV 在 Windows WSL2 上运行 Drupal 9 安装,效果很好。现在我决定为图像设置一个私有文件目录。我已经按照所有说明进行了操作(例如,与 web 目录处于同一级别的私有目录)。我为 cPanel 上的实时服务器做了同样的事情。然后我创建了一个只有图像字段的简单测试实体,指定上传的图像将进入私有目录。

cPanel 服务器版本的工作方式与预期完全一样——当我创建一个新的图像实体时,该图像直接进入了私有目录。所以我很确定我的程序是正确的。

但是 DDEV 版本做了一些神秘的事情。当我创建一个新的图像实体时,一切都很好,创建了实体,我可以看到图像等。但是私有目录是空的。此外,如果我搜索整个 WSL2 文件系统,则找不到图像文件。然而它就在那里,某处。我已经创建了几个这样的实体,现在有一个包含大约十个图像文件的漂亮列表,所有这些都很好地显示。而且所有这些在 WSL2 文件系统中都找不到(至少通过文件名搜索),当然也不会在指定的私有目录中找到。

那么他们在哪里?关于这个谜团有什么想法吗? :-)

谢谢!

附:我只注意到一个线索。第一次,我不小心将我的私人文件目录指定在 web 目录下面。然后它工作正常,我看到了上传的图像文件。但如您所知,说明它不应位于 web 目录内,而应位于其外部,不能通过 HTTPS 访问。因此,也许 DDEV 具有某种不寻常的特性,使得在 web 目录之外拥有私有目录成为问题。

【问题讨论】:

  • 在您的情况下,应该使用 /var/www/html/privatefiles 之类的路径指定私有文件目录,对吗?所以$settings['file_private_path'] = '/var/www/html/privatefiles';,当然还要创建目录。
  • 谢谢 - 我在远程 cPanel 站点和本地 DDEV 站点上都试过了。它在远程 cPanel 站点上运行良好,完全符合预期:也就是说,私有文件完全进入了我指定的私有目录。在本地 DDEV 站点上,这并没有发生。私人文件去了某处,因为它们被显示出来并且被清楚地保存了下来。但我不知道他们在哪里。即使在本地文件系统上搜索也不会显示它们,即使它们显然存在于我计算机的某个位置。好吧,我会继续试验,看看我发现了什么。再次感谢您的关注。
  • 你可以访问 admin/config/media/file-system 看看 Drupal 认为的私有文件目录是什么,看截图:evernote.com/l/AA9LDMWE6D5NJrPrDTrHYJAdKlXbDW0w2Pc
  • 在我的帖子中,我说“......也许 DDEV 有某种不寻常的特性......”。嗯,你现在已经向我描述了那个特性,彻底解开了谜团。我不了解 DDEV 的关键特征,即我必须处理 Web 容器 inside 的路径,并且该路径具有您所说明的结构(/var/www/html/ ...) ;也不是我必须用 ssh 来查看它。我以这种方式重新指定了我的私人目录,并且图像直接进入该目录,就像他们应该做的那样。再次感谢您的帮助!

标签: drupal ddev


【解决方案1】:

要在 ddev 中使用 Drupal 8.9 配置私有文件系统,请执行以下操作:

  1. 在/var/www/html中创建private文件夹,例如/var/www/html/privatefiles(不在html之上,ddev重启时会删除)

  2. 确保该文件夹可被 Web 服务器写入,例如 web 文件夹

     drwxr-xr-x  2 myuser   myuser  4096 january  15 16:36 privatefiles/
     drwxr-xr-x  8 myuser   myuser  4096 january  15 18:59 web/
    
  3. 在你的 settings.php 中设置 $settings['file_private_path'] 值

     $settings['file_private_path'] = '/var/www/html/privatefiles';
    
  4. 清除缓存,Drupal 将在您指定的文件夹中生成适当的 .htaccess 文件

  5. 确认在 admin/report/status 未发现文件系统或私有文件目录错误。可以在 admin/config/media/file-system 查看设置。

【讨论】:

    【解决方案2】:

    rfay的cmets对原帖的回答。

    【讨论】:

      【解决方案3】:

      您可以简单地将以下几行添加到您的分布式settings.php 以仅在 DDEV 内部生效以创建和设置私有文件目录:

      if (isset($_ENV['DDEV_PROJECT'])) {
      
        $private_files_path = $app_root . '/' . $site_path . '/files/private';
      
        if (!is_dir($private_files_path)) {
          mkdir($private_files_path, 0755);
        }
      
        $settings['file_private_path'] = $private_files_path;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-06-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-23
        • 1970-01-01
        相关资源
        最近更新 更多