Bonjour , comme mentionné dans le titre est ce quelqu'un a une idée de rendre l'url propre sans le "public/" et merci

31 réponses


khaleader
Auteur
Réponse acceptée

merci pour vous mais ca marche pas pour laravel 5
la solution qui a marché pour moi c'est de couper tous les fichiers depuis public et les mettre dans la racine
et de changer les deux lignes de index.php
la ligne
require DIR.'/../bootstrap/autoload.php';
par
require DIR.'/bootstrap/autoload.php';

et
$app = require_once DIR.'/../bootstrap/app.php';
par
$app = require_once DIR.'/bootstrap/app.php';
j'espère que cela aide

Bonsoir.
Il te faut le faire via le virtual host en le faisant pointer dans le dossier public.

Très mauvaise idée de déplacer tout ton dossier public.
Tu rends accéssible les dossiers config, app... le fichier .env. Ces dossier contiennet des informations sensible comme les mots de passe de connection a ta bdd.

Comme la dit Lartak tu dois modifier ton vhosrt pour le faire pointer vers ton dossier public.

par exemple sur ovh le dossier racine est le www comment faire ? est ce que je dois renommer www en public et mettre les dossiers de public dedans ou quoi ?

Nous t'avons déja dit ce que tu devais faire, mais tu ne veux pas nous croire, donc ne nous écoutes pas et fais toutes les modifications que tu veux.

Mousieur je n'ai pas compris comment faire pour pointer le vhost vers public

Si tu est sur un serveur mutualisé tu n'a généralement pas la possibilité de modifier les fichier de config d'apache. Cependant si le mod_rewrite est activé (verifiable avec un phpinfo()) tu peux rediriger tes requete avec un fichier .htaccess (https://coderwall.com/p/erbaig/laravel-s-htaccess-to-remove-public-from-url)

Si tu as un serveur dédié tu dois configurer ton virtualhost pour pointer vers le dossier public (https://www.digitalocean.com/community/tutorials/how-to-set-up-apache-virtual-hosts-on-ubuntu-14-04-lts)

Oula, ne jamais déplacer le dossier public... en effet il faut que le vhost pointe sur le dossier public.
Et c'est la seule chose à faire.

Arnich a tous dit.

Bonjour,
" tu dois configurer ton virtualhost pour pointer vers le dossier public"
Et on est obligé d'avoir un serveur dédié pour faire ceci ?
Si on a un hebergement mutualisé (offre perso ou pro chez OVH par exemple), ce n'est pas possible de configurer son virtualhost?

Et mettre ceci (dans un .htacces qu'on créer à la racine du projet):

RewriteEngine On
RewriteRule ^(.*)$ public/$1 [L]

ça ne fonctionne pas.
Merci

Tu as la possibilité de créer un service provider qui redéfinira ton dossier public (public_html ou www) comme ceci :

App::bind('path.public', function()
{
    return base_path() . '/public_html';
});

Je te laisse voir le tuto sur les services provider pour plus d'explications ;)

Ok merci.
J'immagine que tu parles de cette vidéo:
https://www.youtube.com/watch?v=Hug_DHY1tGE

Je vais la regarder tout de suite.

Je ne l'avais pas vu car elle n'est pas dans sa Playlist:
https://www.youtube.com/playlist?list=PLjwdMgw5TTLUCpXVEehCHs99N7IWByS3i

@SquallX :
Je viens de regarder la vidéo, mais ça ne ma pas trop avancer sur le problème. Surtout que ça fait que 3 jours que je débute avec Laravel et la MVC.
J'ai la version 5.1. Et les 2 seuls "solutions" que j'ai trouvé dans Google, est:
Soit avec le .htacces. Mais avec moi (et pas qu'avec moi visiblment) ça ne fonctionne pas.
Soit en mettant ce qu'il y a dans le dossier "public" à la racine. Ce qui n'est pas bon pour des raisons de sécurié.

Y a t-il une vrai solution pour enlever le "public/" des URL ? Et que par exemple cette URL:
http://localhost/Laravel/public/test
Soit accessible uniquement avec cette URL:
http://localhost/Laravel/test
Car si il ni a pas de vrais solution, ça sert à rien que je continu de prendre des cours sur ce Frameworks.

C'est sur qu'il y a une solution avec un service provider ? Car dans google je n'ai rien trouvé...

Ce que j'ai fait, j'ai créé une class PublicServiceProvider qui extend de ServiceProvider.
Dedans je lui est mis cette fonction avec un bind comme tu ma dit :

    public function register() {
        $this->app->bind('path.public', function() {
            return base_path() . '/';
        });
    }

J'ai ensuite ajouté cette nouvelle class dans config/app.php.
Je suis sur le bon chemin? ou je suis déjà largué ? Et après faut faire quoi ?

Merci beaucou

Bonsoir.

Dedans je lui est mis cette fonction avec un bind comme tu ma dit :
J'ai ensuite ajouté cette nouvelle class dans config/app.php.
Je suis sur le bon chemin? ou je suis déjà largué ?

SquallX t'a donné la réponse et tu ne l'appliques pas.

StephWeb, je pense que cette solution devrait fonctionner sur OVH
RewriteEngine On
RewriteBase /
RewriteRule ^(.*)$ public/$1 [L]

@Onnet:
Merci, mais non, j'ai dejà essayé.

@Lartak
Qu'est ce que je n'applique pas? Je suis débutant, donc des trucs qui peuvent etre évidentes pour toi, ne le sont pas pour moi.
Merci

Qu'est ce que je n'applique pas? Je suis débutant, donc des trucs qui peuvent etre évidentes pour toi, ne le sont pas pour moi.

Il te suffit de faire :

App::bind('path.public', function()
{
    return base_path() . '/public';
});

Ok merci.

En fait,
si j'ai fait :

$this->app->bind

Au lieu de ceci :

App::bind

C'est pour aviter cette Fatal Erreur:
"Class 'App\Providers\App' not found"
J'immagine qu'il faut que je mette en haut de ma class use... Mais je ne sais pas quoi mettre après le use.
Et je crois que les 2 façon de faire reviennent au meme.

Mais ton code faut que je lette où exactement?
Dans une fonction "register" dans ma classe que je viens de créer "PublicServiceProvider" qui extend de "ServiceProvider" ? c'est tout?
Car pour le moment, ça ne marche pas, et j'y comprend pas grand chose.
Merci

Ce que j'ai fait, j'ai créé une class PublicServiceProvider qui extend de ServiceProvider.

Pourquoi créer une classe alors qu'il en existe déja une : app\Providers\AppServiceProvider.php ?

Ok merci pour ta réponse. Donc est ce que ce que j'ai ici est bon ou pas? :

Merci

Y a peut etre une autre solution:
_Dans son projet Laravel: renommer le dossier"public" comme ceci : "www".
_Dans son hébergement (OVH par exemple): supprimer tout ce qui est à la racine, y compris le "www" (sauf: .ovhconfig).
_Envoyer son projet sur son hebergement.

Visiblement, avec moi, pour le moment ça fonctionne. J'espère que ça ne va pas provoquer de conflit. Après je pense qu'il faut aussi renommer dans son Laravel, tout les "/public" en "/www", (je pense qu'il y en a que 2 dans server.php).

Y a peut etre une autre solution:

Non, ce que tu proposes est incorrect.

Ok. Alors, Stp, peut tu me dire pourquoi ? Et me proposer une vrai solution qui fonctionne ? Merci beaucoup

Ok. Alors, Stp, peut tu me dire pourquoi ?

Si tu veux faire ton propre Framework ou application MVC, tu fais comme tu veux, mais si les Framework et CMS ont leur propre structure et noms de dossier, ce n'est pas pour rien, comme par exemple pour la sécurité.

Et me proposer une vrai solution qui fonctionne ? Merci beaucoup

Ensuite, des solutions, nous en avons déjà proposés plusieurs (VirtualHost, .htaccess, ServicesProviders), nous n'allons pas en inventer alors qu'il y a ces méthodes là.

"...comme par exemple pour la sécurité."
Oui c'est vrai. Mais avec ce que j'ai proposé plus haut, je ne vois pas du tout en quoi ça joue sur la sécurité. Car seul ce qu'il y avais dans dossier qui s'appelais "public", est visible par les visiteur. Que le dossier s'appelle "public" ou "www", je ne voit pas en quoi ça change. Mais possible que je me trompe, je ne suis pas expert en Frameworks, je débute

"Ensuite, des solutions, nous en avons déjà proposés plusieurs (VirtualHost, .htaccess, ServicesProviders), nous n'allons pas en inventer alors qu'il y a ces méthodes là."
VirtualHoste ce n'est pas possible avec un hébergement mutualisé. .htacces ça ne marche pas avec moi (et visiblement pas avec moi...). ServicesProviders, j'aimerai bien qu'on m'eplique clairement comment faire si c'est possible. Car j'ai beau avoir vu, et revu la vidéo de Grafickart, je n'ai toujours pas trouvé comment faire.
Hier, javais copié ton code :

App::bind('path.public', function()
{
    return base_path() . '/public';
});

dans ma class app\Providers\AppServiceProvider.php, ça n'avais rien changé à mon problème.
merci

Pour les fichier htaccess a tu été voir la doc sur le site OVH ?
A tout hasard : https://www.ovh.com/fr/hebergement-web/astuce_htaccess.xml

_"Pour les fichier htaccess a tu été voir la doc sur le site OVH ?"

Oui, je sais m'en servir, je l'ai utiliser pour un autre projet (avec du code 100/100 maison).

Si sur le meme hebergeur la réécriture d'url marche pour un projet cela doit fonctionner pour ton projet laravel

Tu dois remplacer public (dans le code donné) par le repertoire public de ton hébergeur et place le reste du code à la racine de ton hébergeur (avant public_html ou www)

_"Tu dois remplacer public (dans le code donné) par le repertoire public de ton hébergeur"
Oui Ok comme ceci dans la class AppServiceProvider:

    public function register() {
        //
        $this->app->bind('path.public', function() {
            return base_path() . '/www';
        });
    }

_"et place le reste du code à la racine de ton hébergeur (avant public_html ou www)"
A ok... C'est ceci que je n'avais pas compris... Comme ceci? :
http://www.creerwebsite.com/medias/upload/test.png
car ça ne fonctionne toujours pas ta solution.
Merci

Normalement oui, tu as bien renseigné ton provider ?

Je l'ai mis dans la class AppServiceProvider, qui est déjà renseigné dans config/app.php