3 votes

Comment supprimer /storage de l'URL des images publiques dans mon projet Laravel ?

Ce que j'essaie de faire, c'est de supprimer le /storage de l'URL, de sorte qu'à la fin, ce soit www.example.com/images/x.jpg et non la valeur par défaut www.example.com/storage/x.jpg .

J'ai essayé de supprimer /storage de la url en config/filesystems.php comme ça :

// Original

'public' => [
        'driver' => 'local',
        'root' => storage_path('app/public'),
        'url' => env('APP_URL') . '/storage',
        'visibility' => 'public',
 ],

// Modified

'public' => [
        'driver' => 'local',
        'root' => storage_path('app/public'),
        'url' => env('APP_URL'), // <-- changed
        'visibility' => 'public',
 ],

mais cela ne fonctionne pas. Je pense que le problème est que sans préfixe, il sera considéré comme un fichier dans un dossier public.

Est-il possible de réaliser ce que j'essaie de faire ?

5voto

Travis Britz Points 1476

La façon la plus simple d'y parvenir est d'ajouter un nouveau disque. De cette façon, vous pouvez appliquer le nouveau modèle à vos images sans affecter les fichiers et les urls existants, ainsi qu'un certain nombre d'autres avantages.

Étape 1

Ajoutez votre disque à config/filesystems.php :

'images' => [
        'driver' => 'local',
        'root' => storage_path('app/public/images'),
        'url' => env('APP_URL') . '/images',
        'visibility' => 'public',
 ],

Voici un exemple de la façon dont sauvegarder les téléchargements de fichiers à votre nouveau disque depuis un contrôleur :

// storeAs: path, filename, disk
$request->file('image')->storeAs('/', 'x.jpg', 'images')

Et c'est ainsi que vous générez des liens vers l'image qui ressemblent à ceci http://example.com/images/x.jpg :

Storage::disk('images')->url('x.jpg')

Étape 2

Voici trois options différentes pour servir les fichiers à partir du nouveau chemin ( vous ne devez en choisir qu'un seul ):

Option 1

Créez un lien symbolique dans votre répertoire public.

ln -s /var/www/example.com/storage/app/public/images /var/www/example.com/public/images

Il s'agit de la même méthode que celle utilisée par Laravel pour le disque public par défaut (l'élément /storage URLs).

A partir de Laravel 7, vous pouvez modifier config/filesystems.php pour gérer des liens symboliques supplémentaires :

    /*
    |--------------------------------------------------------------------------
    | Symbolic Links
    |--------------------------------------------------------------------------
    |
    | Here you may configure the symbolic links that will be created when the
    | `storage:link` Artisan command is executed. The array keys should be
    | the locations of the links and the values should be their targets.
    |
    */
    'links' => [
        public_path('storage') => storage_path('app/public'),
        public_path('images')  => storage_path('app/public/images'),
    ],

Option 2

Créez une route dans votre application Laravel pour servir les images :

Route::get('images/{file}', function ($file) {
    return Storage::disk('images')->response($file);
    // or to trigger downloads:
    // return Storage::disk('images')->download($file);
});

L'inconvénient de cette option est qu'elle sert chaque image en utilisant un processus PHP, au lieu d'être gérée par le serveur web comme les options 1 et 3.

Option 3

Créez une règle de réécriture dans votre serveur web.

Dans nginx, cela pourrait ressembler à ceci :

location /images/ {
    root /var/www/example.com/storage/app/public/;
}

Dans Apache, vous pouvez utiliser un alias :

Alias "/images" "/var/www/example.com/storage/app/public/images"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X