Laravel部署:将public目录移至根目录后如何创建有效storage链接?
解决Hostinger虚拟主机Laravel项目Storage链接失效问题
根据你的部署结构(子域名指向/blog,Laravel核心文件在/blog/laravel,public目录内容移至/blog),以下是可行的解决方法:
方法一:修改Laravel配置后执行artisan命令
Laravel默认的public_path指向项目根目录下的public文件夹,现在你的public目录已移至/blog,需要先修正这个路径:
- 编辑
/blog/laravel/app/Providers/AppServiceProvider.php,在boot()方法中添加路径绑定代码:public function boot() { $this->app->bind('path.public', function() { return base_path('../../blog'); }); } - 通过SSH登录主机,进入Laravel根目录:
cd /blog/laravel - 执行storage链接命令:
此命令会在php artisan storage:link/blog目录下创建storage符号链接,指向/blog/laravel/storage/app/public。
方法二:SSH手动创建绝对路径符号链接
之前使用ln -s失败大概率是路径错误,需使用服务器绝对路径执行:
ln -s /home/你的主机用户名/public_html/blog/laravel/storage/app/public /home/你的主机用户名/public_html/blog/storage
注意:替换
你的主机用户名为实际的Hostinger账户用户名,可通过主机面板查看账户信息确认绝对路径。
方法三:修正PHP脚本创建链接
调整之前的脚本,确保路径准确并增加错误检查:
- 在
/blog目录下创建create_storage_link.php文件,内容如下:<?php $targetFolder = $_SERVER['DOCUMENT_ROOT'] . '/laravel/storage/app/public'; $linkFolder = $_SERVER['DOCUMENT_ROOT'] . '/storage'; if (!file_exists($targetFolder)) { die('错误:目标目录不存在 - ' . $targetFolder); } if (file_exists($linkFolder)) { die('错误:链接已存在,请先删除 - ' . $linkFolder); } if (symlink($targetFolder, $linkFolder)) { echo 'Storage链接创建成功!'; } else { echo '创建失败,请检查目录权限或联系主机商确认是否允许创建符号链接'; } ?> - 通过浏览器访问该脚本(如
https://你的子域名/create_storage_link.php),执行完成后立即删除此文件。
注意事项
- 确保
/blog/laravel/storage/app/public目录存在,权限设置为755或775 - 创建链接后,测试访问存储的文件(如
https://你的子域名/storage/test.jpg)验证是否正常 - 若存在旧的无效链接,需先删除
/blog/storage(仅删除符号链接,勿删除实际存储目录)
内容的提问来源于stack exchange,提问作者Luke V
相关产品推荐
相关产品推荐

