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
。
我的项目文件夹结构如下:
. └── /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
。