Laravel共享主机生产环境图片无法显示问题求助
Laravel共享主机部署图片404问题解决指南
问题描述
Laravel应用部署到共享主机后,图片上传功能正常,但访问图片时返回404错误。图片存储在storage/public/actors目录,本地环境完全正常,生产环境修改了index.php路径后出现该问题。
已尝试的操作:
- 两种图片引入方式:
<img src='{{ Storage::url('actors/' . $actor->thumb) }}'> <img src='{{ asset('storage/app/public/actors/' . $actor->thumb) }}'> - 执行
php artisan storage:link创建存储链接 - 将.env中的
FILESYSTEM_DISK从local改为public
补充配置信息
.env配置
APP_NAME=Laravel APP_ENV=local APP_KEY=*** APP_DEBUG=true APP_TIMEZONE=UTC APP_URL=*** APP_LOCALE=en APP_FALLBACK_LOCALE=en APP_FAKER_LOCALE=en_US APP_MAINTENANCE_DRIVER=file APP_MAINTENANCE_STORE=database BCRYPT_ROUNDS=12 LOG_CHANNEL=stack LOG_STACK=single LOG_DEPRECATIONS_CHANNEL=null LOG_LEVEL=debug DB_CONNECTION=mysql DB_HOST=localhost DB_PORT=3306 DB_DATABASE=*** DB_USERNAME=*** DB_PASSWORD=c*** SESSION_DRIVER=database SESSION_LIFETIME=120 SESSION_ENCRYPT=false SESSION_PATH=/ SESSION_DOMAIN=null BROADCAST_CONNECTION=log FILESYSTEM_DISK=public QUEUE_CONNECTION=database CACHE_STORE=database CACHE_PREFIX= MEMCACHED_HOST=127.0.0.1 REDIS_CLIENT=phpredis REDIS_HOST=redis REDIS_PASSWORD=null REDIS_PORT=6379 MAIL_MAILER=smtp MAIL_HOST=mailpit MAIL_PORT=1025 MAIL_USERNAME=null MAIL_PASSWORD=null MAIL_ENCRYPTION=null MAIL_FROM_ADDRESS="hello@example.com" MAIL_FROM_NAME="${APP_NAME}" AWS_ACCESS_KEY_ID= AWS_SECRET_ACCESS_KEY= AWS_DEFAULT_REGION=us-east-1 AWS_BUCKET= AWS_USE_PATH_STYLE_ENDPOINT=false VITE_APP_NAME="${APP_NAME}" SCOUT_DRIVER=meilisearch MEILISEARCH_HOST=http://meilisearch:7700 MEILISEARCH_NO_ANALYTICS=false
filesystem配置
<?php return [ /* |-------------------------------------------------------------------------- | 默认文件系统磁盘 |-------------------------------------------------------------------------- | | 这里可以指定框架默认使用的文件系统磁盘,支持本地磁盘及多种云存储磁盘。 | */ 'default' => env('FILESYSTEM_DISK', 'local'), /* |-------------------------------------------------------------------------- | 文件系统磁盘配置 |-------------------------------------------------------------------------- | | 你可以根据需要配置多个文件系统磁盘,甚至为同一驱动配置多个磁盘。 | 以下是大部分支持的存储驱动示例配置,供参考。 | | 支持的驱动: "local", "ftp", "sftp", "s3" | */ 'disks' => [ 'local' => [ 'driver' => 'local', 'root' => storage_path('app'), 'throw' => false, ], 'public' => [ 'driver' => 'local', 'root' => storage_path('app/public'), 'url' => env('APP_URL').'/storage', 'visibility' => 'public', 'throw' => false, ], 's3' => [ 'driver' => 's3', 'key' => env('AWS_ACCESS_KEY_ID'), 'secret' => env('AWS_SECRET_ACCESS_KEY'), 'region' => env('AWS_DEFAULT_REGION'), 'bucket' => env('AWS_BUCKET'), 'url' => env('AWS_URL'), 'endpoint' => env('AWS_ENDPOINT'), 'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false), 'throw' => false, ], ], /* |-------------------------------------------------------------------------- | 符号链接配置 |-------------------------------------------------------------------------- | | 这里配置执行`storage:link` Artisan命令时要创建的符号链接,数组键为链接位置,值为目标路径。 | */ 'links' => [ public_path('storage') => storage_path('app/public'), ], ];
解决步骤
1. 检查符号链接是否正确创建
共享主机通常限制创建符号链接,php artisan storage:link可能执行失败。手动创建替代方案:
- 通过FTP/文件管理器,在
public目录下创建storage文件夹(如果不存在) - 在
public/storage目录中创建.htaccess文件,添加以下内容:
或者通过主机控制面板的文件管理器手动创建软链接(如果支持)。RewriteEngine On RewriteRule ^(.*)$ ../storage/app/public/$1 [L]
2. 修正图片引入路径
使用Storage::url()时明确指定public磁盘:
<img src="{{ Storage::disk('public')->url('actors/' . $actor->thumb) }}">
或者使用asset()的正确路径(符号链接指向storage/app/public,所以路径无需包含app/public):
<img src="{{ asset('storage/actors/' . $actor->thumb) }}">
3. 确认APP_URL配置正确
.env中的APP_URL必须是生产环境的完整域名(例如https://yourdomain.com),确保末尾没有多余斜杠。
4. 检查文件权限
确保storage/app/public/actors目录权限为755,文件权限为644;部分共享主机可能需要设置为775,可根据主机要求调整。
5. 清除缓存
执行以下命令清除配置、路由及视图缓存:
php artisan config:clear php artisan route:clear php artisan view:clear
如果无法在共享主机执行命令,可手动删除bootstrap/cache目录下的所有缓存文件。
6. 确认index.php路径修改后的影响
如果修改了index.php的位置(比如移到public_html下),需要手动修正public_path()的返回路径,在bootstrap/app.php中添加:
$app->bind('path.public', function() { return __DIR__.'/../public_html'; // 根据实际路径调整 });
修正后需重新确认符号链接的目标路径是否匹配。
内容的提问来源于stack exchange,提问作者Sdsdsd
相关产品推荐
相关产品推荐

