Laravel:将上传文件夹移出public_html文件夹

Laravel: Move the upload folder out of the public_html folder

我的项目文件夹结构如下:

.
└── /home (Inaccessible)
    └── user
        └── public_html
            ├── app
            ┊
            ├── public
            │   ├── css
            │   ┊
            │   └── upload
            ┊
            ├── .htaccess
            └── .env

可以看到,工程上传文件夹在public文件夹下,下面代码显示我的public盘的规格:

'disks' => [
        'public' => [
            'driver' => 'local',
            'root' => public_path('upload'),
            'url' => env('APP_URL').'/upload',
            'visibility' => 'public',
        ],
]

并且因为我的项目在共享主机上,所以我将包含以下内容的 .htaccess 文件添加到 public_html:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(.*)$ public/ [L]
</IfModule>

并且在 .env 文件中我添加了以下行

ASSET_URL=/public

现在我想把上传文件夹移出public_html,我希望项目文件夹的结构如下:

.
└── /home (Inaccessible)
    └── user
        ├── public_html
        └── upload

按如下方式更改public盘的根地址没有得到答案,当我尝试显示照片时,得到404 error.

'root' => preg_replace("/^(.*\/).*$/", "" ,$_SERVER['DOCUMENT_ROOT']).'/upload'
// OR
'root' => base_path('../upload')
//OR
'root' => dirname(__DIR__,2) . '/upload',

这可能吗?

更新
我的文件的链接就像 http://example.com/upload/1611343402_Colors.png

我不知道是否可以允许在共享服务器上直接访问 public_html,即使您真的想要。

这里有一个解决方法:创建一个加载图像的脚本,然后您可以在从任何目录加载图像时以安全的方式操作它。

此处概述了执行此操作的一般方法: Loading an image through PHP

图片来源:joschua011

$img = 'path/to/image.jpg';
header('Content-Type: image/jpeg');
readfile($img);

除此之外,public 文件夹中的图像没有固有问题,只要您保护该文件夹即可。

告诉 laravel 将文件放在那里非常容易。您可以轻松地将磁盘的根目录设置为绝对路径:

'root' => '/home/user/upload'

问题是,apache2 配置为仅处理 public_html 文件夹中的文件。

我会在您的 public_html/public/upload 文件夹和实际的 upload 文件夹之间创建一个符号 link。

ln -s /home/user/upload /home/user/public_html/public/upload

接下来,确保 apache www-data 用户文件夹对该文件夹具有适当的权限 /home/user/upload

现在您可以 link 将文件以与以前相同的方式保存到 public,同时将它们存储在您的自定义文件夹中

如果您使用 laravel,上传文件夹应该在 /root/storage。

查看存储门面的文档https://laravel.com/docs/8.x/filesystem

它是这样工作的。命令 Storage::disk('local')->put('file.txt', 'Contents'); 会将文件存储在配置文件 /root/config/filesystems.php 中定义的“本地”磁盘上。我猜这就是你试图改变根参数的地方。您可以访问控制器文件、作业等存储中的任何文件。

如果要将存储用于需要由 Web 服务器传送的 public 资源,您需要执行以下操作:

使用 shell 命令 php artisan storage:link

在文件夹 /root/public/storage/root/storage/app/public 之间创建一个 symlink

这样您就可以像这样使用存储助手echo asset('storage/file.txt');传送文件/root/storage/app/public/file.txt