Laravel 5 - Supprimer le public de l'URL

241

Je sais que c'est une question très populaire, mais je n'ai pas été en mesure de trouver une solution de travail pour Laravel 5. J'essaie de migrer de Codeigniter depuis longtemps, mais ce processus d'installation compliqué me décourage toujours.

Je ne veux pas exécuter une machine virtuelle, cela semble juste gênant lors du basculement entre les projets.

Je ne veux pas définir ma racine de document dans le dossier public, cela est également gênant lors du basculement entre les projets.

J'ai essayé la méthode .htaccess mod_rewrite

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteRule ^(.*)$ public/$1 [L]
</IfModule>

Cela me donne juste une Laravel NotFoundHttpException dans la ligne 7610 compiled.php.

Lorsque j'ai essayé L4 il y a quelque temps, j'ai utilisé la méthode pour déplacer le contenu du dossier public vers la racine. La structure de L5 est assez différente et en suivant les mêmes étapes a complètement cassé Laravel (le serveur ne retournerait qu'une page vierge).

Existe-t-il une méthode décente pour supprimer le «public» dans un environnement de développement qui:

  1. Fonctionne avec L5
  2. Me permet de basculer entre les projets avec facilité (je travaille généralement sur 2 ou 3 à la fois).

Merci

** J'utilise MAMP et PHP 5.6.2

user1537360
la source
1
La structure des dossiers dans le guide est différente de la mienne, j'imagine qu'il n'utilise pas L5? J'ai omis les modifications qu'il a apportées au fichier Bootstrap / Paths, car il n'existe pas. Le projet semble cependant fonctionner. Pensez-vous que c'est ok?
user1537360
mon erreur permettez-moi d'ajouter une réponse pour L5
kamlesh.bar
pas de succès en essayant de même
kamlesh.bar
1
Cela semble fonctionner en modifiant simplement les chemins dans le fichier index.php, mais je suis nouveau sur Laravel, donc je ne peux évidemment pas dire si c'est stable / sûr.
user1537360
Les autres dossiers / fichiers sont censés se trouver sous la racine de votre document.
Mike Rockétt

Réponses:

431

Pour Laravel 5:

  1. Renommez server.phpdans votre dossier racine Laravel enindex.php
  2. Copiez le .htaccessfichier du /publicrépertoire dans votre dossier racine Laravel.

C'est tout!

Asfaq Tamim
la source
105
Quoi qu'il en soit, cela peut être dangereux, assurez-vous que personne ne peut demander votre .envfichier si vous le faites, sauf si vous êtes d'accord avec les personnes qui consultent le mot de passe de votre base de données en texte clair;)
GabLeRoux
49
Cela ne fonctionnerait pas si vous référençiez vos actifs en utilisant le chemin relatif de la racine, c'est-à-dire. "/assets/styles.css" et ainsi de suite. J'ai toujours du mal à trouver le meilleur moyen de le déployer sur les serveurs
Ghazanfar Mir
1
Cela fonctionne ... Mais y a-t-il une conséquence / un inconvénient à l'utiliser? Beaucoup suggèrent de configurer un hôte virtuel ou de copier des fichiers manuellement, etc ... Est-ce que cela fonctionne aussi en production?
Bogz
1
@GabLeRoux <Files "log.txt">Order Allow,DenyDeny from all</Files>résout le problème que vous avez résolu. Est-il sûr maintenant ou plus de risques?
Butterfly
1
@Butterflyit dépend de la configuration de votre serveur. Ce qui précède ne fera que bloquer log.txt. Assurez-vous simplement de bloquer les données sensibles du public. Si vous utilisez Laravel et lisez attentivement la documentation , votre racine Web ressemblera project/public. Jetez un oeil à cette discussion stackoverflow qa . Configurez votre serveur Web et essayez https://example.com/.envau cas où. Si vous voyez vos mots de passe, considérez tout ce qui est compromis et changez tous les mots de passe.
GabLeRoux
126

J'ai résolu le problème en utilisant 2 réponses:

  1. Renommer le server.php en index.php (aucune modification)
  2. Copiez le .htaccess du dossier public vers le dossier racine (comme rimon.ekjon dit ci-dessous)
  3. Changer .htaccess un peu comme suit pour la statique:

    RewriteEngine On
    
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)/$ /$1 [L,R=301]
    
    RewriteCond %{REQUEST_URI} !(\.css|\.js|\.png|\.jpg|\.gif|robots\.txt)$ [NC]
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
    
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_URI} !^/public/
    RewriteRule ^(css|js|images)/(.*)$ public/$1/$2 [L,NC]

    S'il y a d'autres fichiers statiques nécessaires, ajoutez simplement l'extension à la liste déclarée précédente

ka_lin
la source
1
bonjour @KA_lin. Comment puis-je empêcher quelqu'un d'afficher .env comme so localhost / oap / .env
Fokwa Best
8
Hmmm ... essayezRewriteRule ^.env - [F,L,NC]
ka_lin
2
Ou <Files ~ "\.env$"> Order allow,deny Deny from all </Files>
ka_lin
Merci beaucoup @ka_lin, existe-t-il un moyen de supprimer l'accès via / public /? comme www.votresite.com fonctionne mais www.votresite.com/public fonctionne aussi, est-il possible de supprimer le dernier?
adaba
8
Cela fonctionne mais css, js et images ne se chargent pas
Chetan Khandla
94

Dans Laravel 5.5 créez un fichier .htacess dans votre répertoire racine et placez le code suivant: - Lien de référence

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On

    RewriteCond %{REQUEST_FILENAME} -d [OR]
    RewriteCond %{REQUEST_FILENAME} -f
    RewriteRule ^ ^$1 [N]

    RewriteCond %{REQUEST_URI} (\.\w+$) [NC]
    RewriteRule ^(.*)$ public/$1 

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ server.php

</IfModule>
Raham
la source
5
la meilleure réponse! le seul a fonctionné dans mon exemple, il devrait avoir nettement plus de votes
positifs
Merci c'est du travail pour moi. Mais je veux savoir qu'il y a un problème de sécurité ou non.
rahul singh Chauhan
@rahulsinghChauhan mon plaisir.Dear Je ne sais pas en ce qui concerne le problème de sécurité, mais il doit être sécurisé.
Raham
2
Que fait cette règle RewriteRule ^ ^$1 [N]?
gonzo
C'est le seul qui a fonctionné pour moi ... merci beaucoup
Arshad Ameen
87

PAS!

VOUS NE DEVEZ VRAIMENT PAS renommer server.phpdans votre dossier racine Laravel index.php et copier le .htaccessfichier du /publicrépertoire dans votre dossier racine Laravel !!!

De cette façon, tout le monde peut accéder à certains de vos fichiers ( .envpar exemple). Essayez-le vous-même. Tu ne veux pas ça!


FAIRE

Au lieu de cela, vous devez créer un .htaccessfichier dans votre racine comme ceci:

RewriteEngine On
RewriteCond %{REQUEST_URI} !^/public/
RewriteRule ^(.*)$ /public/$1 [L,QSA]

Cela réécrira silencieusement tous vos URI de base dans le /publicdossier. Même tous les en- têtes , par exemple l'en-tête d'autorisation HTTP , et tous les paramètres URI facultatifs seront également transmis en silence au /publicdossier.

C'est tout

Veuillez noter lors de la configuration d'un projet Laravel avec Docker: vous n'aurez pas besoin de le faire.

Derk Jan Speelman
la source
2
Cela fonctionne bien dans la production, mais cela ne fonctionne pas dans le local, une suggestion?
Haritsinh Gohil
2
Cela fonctionne parfaitement! merci local et serveur pour l'aide à la sécurité!
Ghanshyam Nakiya
1
Bonjour, @DerkJanSpeelman J'essaie de télécharger mes fichiers laravel dans un sous-dossier de mon hébergement comme: (example.com/projects/laravel/blog) dans ce cas, les visiteurs doivent visiter example.com/projects/laravel/blog/ public, afin que je mette un fichier .htaccess avec votre code dans la racine du dossier de blog et que je le redirige vers le dossier public. Mais ça ne marche pas. Voici l'erreur qui se produit: L'URL demandée / public / est introuvable sur ce serveur. Comment puis-je resoudre ceci ?
Shovon Das
1
Cette réponse est sous-estimée. A voté pour Bold et a mis en évidence Don't. Cela fonctionne très bien.
Varun Ved
2
The Perfect Answer
alnassre
43

Un moyen facile de supprimer le public de l'url de laravel 5. Il vous suffit de couper index.php et .htaccess du répertoire public et de les coller dans le répertoire racine, c'est tout et de remplacer deux lignes dans index.php comme

require __DIR__.'/bootstrap/autoload.php';
$app = require_once __DIR__.'/bootstrap/app.php';

Remarque : La méthode ci-dessus est réservée aux débutants car ils peuvent rencontrer des problèmes lors de la configuration de l'hôte virtuel et la meilleure solution consiste à configurer l'hôte virtuel sur la machine locale et à la pointer vers le répertoire public du projet.

Muhammad Sadiq
la source
1
Après que css ne se charge pas, bcoz tous les css sont en public et le public est supprimé de l'url
M. Tomar
1
Vous pouvez mettre "public /" avant les fichiers js ou css pendant le chargement, par exemple Html :: script ("public / js / ....."); --Mais la meilleure solution serait l'hôte virtuel ...
Muhammad Sadiq
39

@ rimon.ekjon a déclaré:

Renommez le server.php dans votre dossier racine Laravel en index.php et copiez le fichier .htaccess du répertoire / public dans votre dossier racine Laravel. -- C'est tout !! :)

Ça marche pour moi. Mais tous les fichiers de ressources dans le répertoire / public n'ont pas pu trouver et les URL de demande n'ont pas fonctionné, car j'ai utilisé l'assistant asset ().

J'ai changé la fonction /Illuminate/Foundation/helpers.php/asset () comme suit:

function asset($path, $secure = null)
{
    return app('url')->asset("public/".$path, $secure);
}

Maintenant, tout fonctionne :)

Merci @ rimon.ekjon et à vous tous.

Miron
la source
3
Ce n'est pas un bon moyen de résoudre ce problème, car vous essayez de mettre à jour dans le répertoire des fournisseurs, ce qui n'est pas une bonne pratique.
Shadman
1
il vous suffit d'ajouter RewriteRule ^(.*)$ public/$1 [L]dans votre fichier .htaccess que vous avez copié du répertoire public, en supprimant cette ligneRewriteRule ^(.*)/$ /$1 [L,R=301]
Shadman
29

Créez simplement un fichier .htaccess à la racine et ajoutez-y ces lignes

<IfModule mod_rewrite.c>
    RewriteEngine On

    RewriteRule ^(.*)$ public/$1 [L]
</IfModule>

C'est tout!

Le code ci-dessus fonctionne sur le dossier public_html racine. Cela dit, votre fichier laravel principal devrait se trouver dans le dossier public_html, si votre répertoire ressemble à public_html / laravelapp / public et si vous placez le code ci-dessus dans laravelapp, cela ne fonctionnera pas. Par conséquent, vous devez copier tous vos fichiers principaux dans public_html et y placer le fichier .htaccess.

Si vous souhaitez conserver le code dans un sous-répertoire, vous pouvez créer un sous-domaine, ce code fonctionnera également pour cela.

Abhinav Saraswat
la source
J'ai répondu ci-dessous avant de lire votre réponse et ce doit être la réponse acceptée. Aucun changement de fichier: juste une règle simple et intelligente.
Brigo
@Raham quelle est votre URL actuelle?
Abhinav Saraswat
2
Je veux juste ajouter une brève description en plus du travail de ces messieurs. Le code ci-dessus fonctionne sur le dossier racine public_html (j'ai également eu des problèmes). Après avoir dit que votre fichier laravel principal devrait être dans le dossier public_html, j'ai fait une erreur que mon répertoire ressemblait à public_html / laravelapp / public si vous mettez le code ci-dessus dans laravelapp, cela ne fonctionnera pas. Par conséquent, vous devez copier tous vos fichiers principaux dans public_html et y placer le fichier .htaccess. Référencement à l'hébergement centOS et Cpanel pour laravel.
Deepesh Thapa
Quels sont les défauts de l'utilisation de cette méthode?
Script47
1
Fonctionné comme un charme pour moi, je n'avais que webshost cPanel et ne pouvais pas changer le RootDirectory pour Apache. Merci ! le plus simple et le plus sûr. Cela ne permettra pas de voir le contenu de votre dossier racine
Vincent Decaux
27

Créez un .htaccessfichier dans le répertoire racine et placez du code comme ci-dessous.

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On

    RewriteCond %{REQUEST_FILENAME} -d [OR]
    RewriteCond %{REQUEST_FILENAME} -f
    RewriteRule ^ ^$1 [N]

    RewriteCond %{REQUEST_URI} (\.\w+$) [NC]
    RewriteRule ^(.*)$ public/$1 

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ server.php
</IfModule>
Pallav Nagar
la source
1
Je recommande vraiment cette solution.
TheLastCodeBender
1
Je recommande également cette solution
iglesiasedd
Merci beaucoup. C'est parfait (y)
Prappo Islam Prince
3
cela fonctionne bien, mais le fichier .env est toujours accessible directement à partir de l'URL.
Manoj Singh
est-ce une solution sécurisée?
Sr. PHP Programmer Team Lead
23

1) Je n'ai pas trouvé de méthode de travail pour déplacer le répertoire public en L5 . Bien que vous puissiez modifier certaines choses dans le bootstrapindex.php , il semble que plusieurs fonctions d'assistance soient basées sur l'hypothèse que ce répertoire public est là. En toute honnêteté, vous ne devriez vraiment pas déplacer le répertoire public.

2) Si vous utilisez MAMP, vous devez créer de nouveaux vhosts pour chaque projet, chacun servant le répertoire public de ce projet. Une fois créé, vous accédez à chaque projet par votre nom de serveur défini comme ceci:

http://project1.dev
http://project2.dev
Jeremy Schaffer
la source
15

Il est possible de supprimer l' url publique dans laravel5. Suivez ces étapes:

étape 1.copiez tous les fichiers du public et collez-les dans le répertoire racine

étape 2. ouvrir le index.phpfichier remplacer par

 require __DIR__.'/../bootstrap/autoload.php';

à

 require __DIR__.'/bootstrap/autoload.php';

et

$app = require_once __DIR__.'/../bootstrap/app.php';

à

$app = require_once __DIR__.'/bootstrap/app.php';

Et supprimez tout le cache et les cookies.

piyush patel
la source
Salut, j'ai essayé votre méthode, effectué les étapes ci-dessus, mais il affiche les erreurs suivantes: Avertissement: require_once (D: \ Projects \ laravel / public / index.php): échec de l'ouverture du flux: aucun fichier ou répertoire de ce type dans D: \ Projects \ laravel \ server.php on line 21 Erreur fatale: require_once (): Échec de l'ouverture requise 'D: \ Projects \ laravel / public / index.php' (include_path = '.; C: \ xampp \ php \ PEAR' ) dans D: \ Projects \ laravel \ server.php sur la ligne 21
Ali Shahzad
Ce n'est pas une réponse parfaite, c'est plutôt un moyen peu sûr.
Rohit
11

Supposons que vous ayez placé tous les autres fichiers et répertoires dans un dossier nommé «locale».

entrez la description de l'image ici

Allez simplement dans index.php et trouvez ces deux lignes:

require __DIR__.'/../bootstrap/autoload.php';

$app = require_once __DIR__.'/../bootstrap/app.php';

et changez-les en ceci:

require __DIR__.'/locale/bootstrap/autoload.php';

$app = require_once __DIR__.'/locale/bootstrap/app.php';
Angelo Joseph Salvador
la source
11

Voici la meilleure et la plus courte solution qui fonctionne pour moi depuis mai 2018 pour Laravel 5.5

  1. il suffit de couper votre .htaccessfichier du répertoire / public vers le répertoire racine et de le remplacer par le code suivant:

    <IfModule mod_rewrite.c>
        <IfModule mod_negotiation.c>
           Options -MultiViews
        </IfModule>
    
        RewriteEngine On
    
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteRule ^(.*)/$ /$1 [L,R=301]
    
        RewriteCond %{REQUEST_URI} !(\.css|\.js|\.png|\.jpg|\.gif|robots\.txt)$ [NC]
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteRule ^ server.php [L]
    
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_URI} !^/public/
        RewriteRule ^(css|js|images)/(.*)$ public/$1/$2 [L,NC]
    </IfModule>
  2. Enregistrez simplement le .htaccessfichier et c'est tout.

  3. Renommez votre server.phpfichier en index.php. c'est tout profiter!

tony pro
la source
9

Meilleure approche: je ne recommanderai pas de supprimer public, à la place on local computer create a virtual host point to public directoryet on remote hosting change public to public_html and point your domain to this directory. Raison, tout votre code laravel sera sécurisé car son niveau descend jusqu'à votre répertoire public :)

MÉTHODE 1:

Je renomme juste server.phpà index.phpet il fonctionne

MÉTHODE 2:

Cela fonctionne bien pour toutes les versions laravel ...

Voici ma structure de répertoire,

/laravel/
... app
... bootstrap
... public
... etc

Suivez ces étapes faciles

  1. déplacer tous les fichiers du répertoire public vers root / laravel /
  2. maintenant, pas besoin de répertoire public, vous pouvez donc éventuellement le supprimer maintenant
  3. ouvrez maintenant index.php et effectuez les remplacements suivants

nécessite DIR . '/ .. / bootstrap / autoload.php';

à

nécessite DIR . '/ bootstrap / autoload.php';

et

$ app = require_once DIR . '/ .. / bootstrap / start.php';

à

$ app = require_once DIR . '/ bootstrap / start.php';

  1. ouvrez maintenant bootstrap / paths.php et changez le chemin du répertoire public:

'public' => DIR . '/ .. / public',

à

'public' => DIR . '/ ..',

et c'est tout, essayez maintenant http: // localhost / laravel /

Wasim A.
la source
C'est ok pour tout. mais la commande artisan ne fonctionne pas, elle montre simplement "Impossible d'ouvrir le fichier d'entrée: artisan". Y a-t-il une suggestion?
Kabir Hossain
Cette méthode a fonctionné, si vous êtes d'accord pour exposer vos informations d'identification de base de données aux utilisateurs. localhost / laravel / .env
MasoodUrRehman
8

4 meilleures façons de supprimer le public de l'URL.

Si vous avez utilisé une autre astuce pour supprimer le public de l'URL, changez le nom de server.php en index.php et changez-le en chemin d'accès au fichier principal. De toute évidence, ne faites pas ça. Alors pourquoi Laravel ne donne pas la solution comme ça parce que ce n'est pas une bonne façon de le faire.

1) Supprimer le public de l'URL en utilisant htaccess dans Laravel

En ajoutant un fichier .htaccess à la racine, vous pouvez accéder au site Web sans public

<ifmodule mod_rewrite.c>
    <ifmodule mod_negotiation.c>
        Options -MultiViews
    </ifmodule>

    RewriteEngine On

    RewriteCond %{REQUEST_FILENAME} -d [OR]
    RewriteCond %{REQUEST_FILENAME} -f
    RewriteRule ^ ^$1 [N]

    RewriteCond %{REQUEST_URI} (\.\w+$) [NC]
    RewriteRule ^(.*)$ public/$1 

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ server.php

</ifmodule>

2) Supprimez le public en créant un hôte virtuel dans votre local

Je donne ici une démo pour le système d'exploitation Windows. Mais je vais essayer de définir une étape pour que n'importe qui puisse facilement suivre l'étape. Vous pouvez également rechercher sur google la même chose pour le système d'exploitation particulier.

Étape 1: Allez dans C: \ Windows \ system32 \ drivers \ etc \ ouvrez le fichier "hosts" en mode Administrateur.

Étape 2: ajoutez-y le code suivant. Ici, je vous donne une démo de la démonstration du nom de domaine projectname.local, vous pouvez en spécifier à votre guise. Rendez-le constant à chaque endroit.

127.0.0.1  projectname.local

Étape 3: Maintenant, allez à, C:\xampp\apache\conf\extrapour les utilisateurs de xampp et pour l'utilisateur wamp "C:\wamp\bin\apache\Apache2.4.4\conf\extra"et ouvrez le "httpd-vhosts.conf"fichier. Maintenant, ajoutez-y le code suivant.

Remarques: Modifiez la racine du document selon votre projet et ajoutez également le nom de domaine que vous définissez dans le fichier "hosts".

<VirtualHost projectname.local>
      ServerAdmin projectname.local
      DocumentRoot "C:/xampp/htdocs/projectdir"
      ServerName projectname.local
      ErrorLog "logs/projectname.local.log"
      CustomLog "logs/projectname.local.log" common
 </VirtualHost>

Étape 4: Dernier point, mais l'étape importante est de redémarrer votre Xampp ou Wamp et d'accéder à l'URL comme http://projectname.localet votre Laravel répondra sans URL publique.


3) Supprimer le public en exécutant la commande dans Laravel

Si vous travaillez en local, vous n'avez rien à faire, il suffit d'exécuter la commande suivante à partir de votre terminal ou de votre outil de ligne de commande. Après cela, vous pouvez accéder à votre site Web par l'URL fournie par la ligne de commande.

   > php artisan serve

Si vous souhaitez exécuter votre projet sur une adresse IP particulière, vous devez exécuter la commande suivante. Si vous travaillez sur un réseau local, si vous souhaitez autoriser d'autres personnes à accéder à votre site Web à partir du local, il vous suffit de vérifier votre adresse IP à l'aide de la ligne de commande en exécutant "ipconfig" après avoir exécuté votre adresse IP après la commande.

> php artisan serve --host=192.168.0.177

Si vous souhaitez exécuter votre projet sur une IP particulière avec un port particulier, vous devez exécuter la commande suivante.

> php artisan serve --host=192.168.0.177 --port=77

4) Supprimer le public sur le serveur hébergé ou sur le cpanel

entrez la description de l'image ici

Une fois le projet terminé, vous devez héberger le projet sur le serveur, puis il vous suffit de définir la racine du document de votre domaine dans le dossier public. Vérifiez la capture d'écran ci-dessous.

Selon la capture d'écran, si vous n'avez aucun dossier de projet dans le public_html, il vous suffit de définir la racine de votre document comme "public_html/public".

Référence prise d' ici

Mayank Dudakiya
la source
1
Les quatre façons sont bonnes, mais j'ai résolu mon problème en utilisant la première solution.
Manisha
7

Je voudrais ajouter à @Humble Learner et noter que l'emplacement approprié pour «corriger» le chemin de l'URL pour les actifs est /Illuminate/Routing/UrlGenerator.php/asset ().

Mettez à jour la méthode pour qu'elle corresponde:

public function asset($path, $secure = null)
{
    if ($this->isValidUrl($path)) return $path;
    $root = $this->getRootUrl($this->getScheme($secure));
    return $this->removeIndex($root).'/public/'.trim($path, '/');
}

Cela corrigera les scripts, les styles et les chemins d'image. Tout pour les chemins d'accès aux actifs.

Sean Perkins
la source
6

Pour que l'utilisateur XAMPP supprime le public de l'URL sans toucher au système de fichiers par défaut de laravel, vous devez définir un hôte virtuel pour votre application.

  1. Ouvrez l'application du panneau de configuration XAMPP et arrêtez Apache. Sachez que les dernières machines Windows peuvent l'exécuter en tant que service, alors cochez la case à gauche du module Apache.

  2. Accédez à C:/xampp/apache/conf/extraou où se trouvent vos fichiers XAMPP.

  3. Ouvrez le fichier nommé httpd-vhosts.conf avec un éditeur de texte.

  4. Autour de la ligne 19, recherchez # NameVirtualHost *:80et décommentez ou supprimez le hachage.

  5. Tout en bas du fichier, collez le code suivant:

<VirtualHost *>
    ServerAdmin [email protected]
    DocumentRoot "C:/xampp/htdocs" # change this line with your htdocs folder
    ServerName localhost
    ServerAlias localhost
    <Directory "C:/xampp/htdocs">
        Options Indexes FollowSymLinks Includes ExecCGI
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>
  1. Vous pouvez maintenant copier et coller le code ci-dessus pour ajouter vos répertoires d'hôte virtuel. Par exemple, je travaille sur un site appelé Eatery Engine, donc l'extrait de code suivant me permettra de travailler avec des sous-domaines sur mon installation locale:
<VirtualHost eateryengine.dev>
    ServerAdmin [email protected]
    DocumentRoot "C:/xampp/htdocs/eateryengine" # change this line with your htdocs folder
    ServerName eateryengine.dev
    ServerAlias eateryengine.dev
    <Directory "C:/xampp/htdocs/eateryengine">
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>
  1. Ensuite, dirigez-vous vers votre fichier hôte Windows pour modifier votre HÔTE. le fichier sera situé à C:/Windows/System32/drivers/etc/hosts, où hôtes est le fichier. Ouvrez-le avec le bloc-notes.
  2. Recherchez la résolution de noms #localhost est gérée dans DNS lui-même.

127.0.0.1 localhost

La résolution de nom localhost est gérée dans DNS lui-même.

127.0.0.1       localhost
127.0.0.1       eateryengine.dev #change to match your Virtual Host.
127.0.0.1       demo.eateryengine.dev #manually add new sub-domains.
  1. Redémarrez Apache et testez tout.

L'article original se trouve ici

kashyap ensoleillé
la source
5

Il y a toujours une raison d'avoir un dossier public dans la configuration de Laravel, tous les trucs liés au public doivent être présents dans le dossier public,

Ne pointez pas votre adresse IP / domaine vers le dossier racine du Laravel mais dirigez-le vers le dossier public. Il n'est pas sûr de pointer le serveur Ip vers le dossier racine., Car sauf si vous écrivez des restrictions dans.htaccess , on peut facilement accéder aux autres fichiers.,

Il suffit d'écrire la condition de réécriture dans le .htaccessfichier et d'installer le module de réécriture et d'activer le module de réécriture, le problème qui ajoute du public dans l'itinéraire sera résolu.

Reiah Paul Sam
la source
3

Je sais que ce sont beaucoup de solutions à ce problème. La solution la meilleure et la plus simple consiste à ajouter un fichier .htaccess à la racine répertoire .

J'ai essayé les réponses que nous avons fournies pour ce problème, mais j'ai rencontré des problèmes avec auth: api guard à Laravel.

Voici la solution mise à jour:

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On
    RewriteCond %{HTTP:Authorization} ^(.*)
    RewriteRule .* - [e=HTTP_AUTHORIZATION:%1]

    RewriteCond %{REQUEST_FILENAME} -d [OR]
    RewriteCond %{REQUEST_FILENAME} -f
    RewriteRule ^ ^$1 [N]

    RewriteCond %{REQUEST_URI} (\.\w+$) [NC]
    RewriteRule ^(.*)$ public/$1

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ server.php
</IfModule>

Créez le fichier .htaccess dans votre répertoire racine et ajoutez ce code. Et tout va bien

CHARITRA SHRESTHA
la source
2

Laravel 5.5

Après avoir installé Laravel pour la première fois, j'ai fait face au fameux "problème de dossier public" et j'ai trouvé cette solution qui, à mon avis , est "plus propre" que les autres que j'ai trouvées sur le Web.


Réalisations

  • Ne pas avoir de publicmot dans l'URI
  • Protégez le .envfichier contre les personnes curieuses

Tout peut être fait simplement en éditant l' .htaccessutilisation mod_rewriteet en quatre règles simples.


Pas

  1. Déplacez le .htaccessfichier danspublic/.htaccess dans la racine principale
  2. Modifiez-le comme ci-dessous

J'ai tout commenté, donc ça devrait être clair (j'espère) aussi à ceux qui ne l'ont jamais utilisé mod_rewrite(pas que je sois un expert, tout le contraire). De plus, pour comprendre les règles, il doit être clair que, à Laravel, si Bill se connecte à https://example.com, https://example.com/index.phpest chargé. Ce fichier contient simplement la commande header("refresh: 5; https://example.com/public/"), qui envoie la demande à https://example.com/public/index.php. Cette seconde index.phpest chargée de charger le contrôleur et d'autres trucs.

# IfModule prevents the server error if the app is moved in an environment which doesn’t support mod_rewrite
<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On

    # RULES ORIGINALLY IN public/.htaccess ---
    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} (.+)/$
    RewriteRule ^ %1 [L,R=301]

    # Handle Front Controller...
#    RewriteCond %{REQUEST_FILENAME} !-d
#    RewriteCond %{REQUEST_FILENAME} !-f
#    RewriteRule ^ index.php [L]

    # Handle Authorization Header
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
    # --- END

    # PERSONAL RULES ---
    # All the requests on port 80 are redirected on HTTPS
    RewriteCond %{SERVER_PORT} ^80$
    RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R,L]

    # When .env file is requested, server redirects to 404
    RewriteRule ^\.env$ - [R=404,L,NC]

    # If the REQUEST_URI is empty (means: http://example.com), it loads /public/index.php
    # N.B.: REQUEST_URI is *never* actually empty, it contains a slash that must be set as match as below
    # .* means: anything can go here at least 0 times (= accepts any sequence of characters, including an empty string)
    RewriteCond %{REQUEST_URI} ^/$
    RewriteRule ^(.*) /public/index.php [L]

    # If the current request is asking for a REQUEST_FILENAME that:
    # a) !== existent directory
    # b) !== existent file
    # => if URI !== css||js||images/whatever => server loads /public/index.php, which is responsible to load the app and the related controller
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule !^(css|js|images|media)/(.*)$ /public/index.php [L,NC]

    # If the current request is asking for a REQUEST_FILENAME that:
    # a) !== existent directory
    # b) !== existent file
    # => if URI == css||js||images[=$1]/whatever[=$2] => server loads the resource at public/$1/$2
    # If R flag is added, the server not only loads the resource at public/$1/$2 but redirects to it
    # e.g.: bamboo.jpg resides in example.com/public/media/bamboo.jpg
    #       Client asks for example.com/media/bamboo.jpg
    #       Without R flag: the URI remains example.com/media/bamboo.jpg and loads the image
    #       With R flag: the server redirects the client to example.com/public/media/bamboo.jpg and loads the image
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(css|js|images|media)/(.*)$ /public/$1/$2 [L,NC]
    # --- END

</IfModule>

La règle suivante (à l'origine public/.htaccess) peut être supprimée. En fait, la même règle est expliquée de manière plus détaillée dans les deux dernières règles.

# Handle Front Controller...
#    RewriteCond %{REQUEST_FILENAME} !-d
#    RewriteCond %{REQUEST_FILENAME} !-f
#    RewriteRule ^ index.php [L]

EDIT: J'ai raté la solution d' Abhinav Saraswat et sa réponse devrait être acceptée. Une seule règle simple et claire qui redirige tout le trafic vers le dossier public sans modifier aucun fichier.

Brigo
la source
2

Tout d'abord, vous pouvez utiliser ces étapes

Pour Laravel 5:

1. Renommez server.php dans votre dossier racine Laravel en index.php

2. Copiez le fichier .htaccess du répertoire / public dans votre dossier racine Laravel.

source: https://stackoverflow.com/a/28735930

après avoir suivi ces étapes, vous devez modifier tous les chemins css et script, mais cela sera fatigant.

Proposition de solution : vous pouvez simplement modifier légèrementhelpers::asset fonction.

Pour cela :

  1. ouvert vendor\laravel\framework\src\Illuminate\Foundation\helpers.php

  2. goto ligne 130

  3. écrire "public/".$pathau lieu de $path,

    function asset($path, $secure = null){
       return app('url')->asset("public/".$path, $secure);
    }
Ferhat KOÇER
la source
2
Règle numéro 1: ne modifiez jamais un fichier core. Même si cela semble facile et agréable maintenant, vous paierez plus tard.
Janaka Dombawela
@JanakaDombawela je ne pense pas de cette façon parce que:
Ferhat KOÇER
@JanakaDombawela Je ne pense pas de cette façon parce que: Senerio 1: si le développeur est expérimenté: le code open source est pour ce travail Senerio 2: si le développeur est un junior, le développeur doit faire la modification du code source pour acquérir de l'expérience
Ferhat KOÇER
2
<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews -Indexes
    </IfModule>

    RewriteEngine On

    # Handle Authorization Header
    RewriteRule ^(.*)$ public/$1 [L]
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} (.+)/$
    RewriteRule ^ %1 [L,R=301]

    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

Activez le module mod_rewrite avec

sudo a2enmod rewrite

et redémarrez l'apache

sudo service apache2 restart

Pour utiliser mod_rewrite à partir de fichiers .htaccess (qui est un cas d'utilisation très courant), modifiez le VirtualHost par défaut avec

sudo nano /etc/apache2/sites-available/000-default.conf

Sous "DocumentRoot / var / www / html", ajoutez les lignes suivantes:

<Directory "/var/www/html">
AllowOverride All
</Directory>

Redémarrez à nouveau le serveur:

sudo service apache2 restart
mujuonly
la source
1

J'ai lu un article avant et ça marche bien mais je ne sais vraiment pas si c'est sûr ou pas

    a. Create new folder local.
    b. Move all project into the local folder expect public folder.
    c. Move all the content of public folder to project root.
    d. Delete the blank public folder
    f. Edit the index file. 

Modifiez le fichier index.php

require __DIR__.'/../bootstrap/autoload.php';
$app = require_once __DIR__.'/../bootstrap/app.php';

à

require __DIR__.'/local/bootstrap/autoload.php';
$app = require_once __DIR__.'/local/bootstrap/app.php';
Yousef Altaf
la source
1

Même si je ne recommande pas de mettre Laravel sur le dossier racine, il y a des cas où cela ne pourrait pas être évité; pour ces cas, les méthodes ci-dessus ne fonctionnent pas pour les actifs, j'ai donc fait une correction rapide en changeant le htaccess: après avoir copié server.php en index.php éditez le fichier .htaccess comme ceci:

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On

    ### fix file rewrites on root path ###
    #select file url
    RewriteCond %{REQUEST_URI} ^(.*)$
    #if file exists in /public/<filename>
    RewriteCond %{DOCUMENT_ROOT}/public/$1 -f
    #redirect to /public/<filename>
    RewriteRule ^(.*)$ public/$1 [L]
    ###############

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)/$ /$1 [L,R=301]

    # Handle Front Controller...

    #RewriteCond %{REQUEST_FILENAME} -d # comment this rules or the user will read non-public file and folders!
    #RewriteCond %{REQUEST_FILENAME} -f #
    RewriteRule ^ index.php [L]
</IfModule>

C'était une solution rapide que je devais faire, donc tout le monde est le bienvenu pour le mettre à niveau.

Plokko
la source
1

Le problème est que si vous tapez / public et qu'il sera toujours disponible dans l'url, j'ai donc créé un correctif qui devrait être placé dans le public / index.php

  $uri = urldecode(
     parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH)
  );

  if(stristr($uri, '/public/') == TRUE) {

    if(file_exists(__DIR__.'/public'.$uri)){

    }else{

      $actual_link = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}";
      $actual_link = str_replace('public/', '',$actual_link);
      header("HTTP/1.0 404 Not Found");
      header("Location: ".$actual_link."");
      exit();
      return false;
   }}

cette paix de code supprimera le public de l'URL et donnera un 404, puis redirigera vers l'URL sans le public

Paul De Zwaan
la source
0

Une autre méthode que j'utilise est de créer un lien symbolique (sous Linux, je ne sais pas pour Win) en utilisant la commande ln dans htdocs ou www ie ln projectname/public project Le site est donc accessible via localhost / project

Eli Makumba
la source
0

Vous pouvez supprimer un mot clé public de l'URL à l'aide de différentes méthodes.

1) Si vous utilisez un hébergement dédié et que vous avez un accès root, vous pouvez supprimer le mot-clé public de l'URL à l'aide de l'hôte virtuel. Vous devez donner le chemin DocumentRoot avec public. Donc, cela démarrera l'index du répertoire public et le supprimera de l'url.

<VirtualHost *:80>
    ServerAdmin [email protected]
    ServerName example.com
    ServerAlias www.example.com
    DocumentRoot /var/www/html/{yoursourcedirectory}/public

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

2) Si vous n'avez pas accès root à votre hébergement, vous devez générer un nouveau fichier .htaccess dans votre répertoire racine et mettre le code comme ci-dessous

<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
    Options -MultiViews
</IfModule>

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ ^$1 [N]

RewriteCond %{REQUEST_URI} (\.\w+$) [NC]
RewriteRule ^(.*)$ public/$1 

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ server.php
</IfModule>

Vous pouvez obtenir plus de références ici.

Vinod Joshi
la source
0

Créez un fichier .htaccess dans le répertoire racine et placez quelque chose comme ci-dessous.

<IfModule mod_rewrite.c>
 #Session timeout

<IfModule mod_negotiation.c>
    Options -MultiViews
</IfModule>

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ ^$1 [N]

RewriteCond %{REQUEST_URI} (\.\w+$) [NC]
RewriteRule ^(.*)$ public/$1

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ server.php

</IfModule>

Créez un fichier .htaccess dans le répertoire / public et placez quelque chose comme ci-dessous.

<IfModule mod_rewrite.c>
  <IfModule mod_negotiation.c>
    Options -MultiViews -Indexes
  </IfModule>

RewriteEngine On

# Handle Authorization Header
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

# Redirect Trailing Slashes If Not A Folder...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.+)/$
RewriteRule ^ %1 [L,R=301]

# Handle Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
</IfModule>
Ghanshyam Nakiya
la source
-1

J'ai trouvé la solution la plus efficace à ce problème.

Modifiez simplement votre .htaccessdans le dossier racine et écrivez le code suivant. Rien d'autre requis

RewriteEngine on
RewriteCond %{REQUEST_URI} !^public
RewriteRule ^(.*)$ public/$1 [L]

<IfModule php7_module>
   php_flag display_errors Off
   php_value max_execution_time 30
   php_value max_input_time 60
   php_value max_input_vars 1000
   php_value memory_limit -1
   php_value post_max_size 8M
   php_value session.gc_maxlifetime 1440
   php_value session.save_path "/var/cpanel/php/sessions/ea-php71"
   php_value upload_max_filesize 2M
   php_flag zlib.output_compression Off
</IfModule>
AKHIL RAJ
la source
-1

j'ai essayé une solution ici et j'ai trouvé htaccess qui fonctionne pour laravel 5.2, comme ceci:

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [L,R=301]



RewriteCond %{REQUEST_URI} !(\.css|\.js|\.png|\.jpg|\.gif|robots\.txt)$ [NC]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ server.php

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^/public/
RewriteRule ^(css|js|images)/(.*)$ public/$1/$2 [L,NC]
RewriteRule ^.env - [F,L,NC]
RewriteRule ^app - [F,L,NC]
RewriteRule ^bootstrap - [F,L,NC]
RewriteRule ^config - [F,L,NC]
RewriteRule ^database - [F,L,NC]
RewriteRule ^resources - [F,L,NC]
RewriteRule ^vendor - [F,L,NC]

lorsque vous avez un autre fichier ou dossier à interdire, ajoutez simplement

RewriteRule ^your_file - [F,L,NC]
Adam
la source
-1

Vous n'avez pas besoin de faire grand-chose, créez simplement un fichier .htaccess dans le répertoire racine et collez / enregistrez ce qui suit;

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(.*)$ public/$1 [L]
</IfModule>
Victor Ifeanyi Ejiogu
la source
Cela me redirige vers / public / public
zanderwar
@zanderwar, quelle est la version de Laravel? Aussi, j'espère que vous n'avez pas votre projet sur un sous-répertoire du répertoire principal?
Victor Ifeanyi Ejiogu
Le projet est root, la version est 5.6. * - Il est cependant sur un sous-domaine, sur l'hébergement partagé; malheureusement, cette installation de cPanel oblige les sous-domaines à avoir un dossier dans public_html
zanderwar