You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 09:24:50