Laravel 5-supprimer le public de L'URL

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'ai essayé de migrer de Codeigniter pendant longtemps, mais ce processus d'installation alambiqué ne cesse de me rebuter.

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

Je ne veux pas définir la racine de mon document sur le dossier public, cela est également gênant lors de la commutation entre les projets.

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

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

Cela me donne juste une Laravel NotFoundHttpException dans compilé.php ligne 7610.

Quand j'ai essayé L4 il y a un moment, j'ai utilisé la méthode de déplacement du contenu du dossier public dans la racine. La structure de L5 est assez différente et suivant les mêmes étapes a complètement brisé Laravel (le serveur ne retournerait qu'une page blanche).

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

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

Merci

* * j'utilise MAMP et PHP 5.6.2

166
demandé sur user1537360 2015-02-06 14:13:39

22 réponses

Pour Laravel 5:

  1. renommez server.php dans votre dossier racine Laravel en index.php
  2. Copiez le fichier .htaccess du répertoire /public vers votre racine Laravel dossier.

C'est ça !! :)

330
répondu Asfaq Tamim 2017-04-16 20:19:35

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

  1. renommer le serveur.php à indexer.php (aucune modification)
  2. Copiez le .htaccess du dossier public au 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 existe d'autres fichiers statiques besoin d'ajouter l'extension à la précédente déclaré liste

95
répondu ka_lin 2017-02-16 20:13:08

Moyen facile de supprimer public de laravel 5 url. Vous avez juste besoin de couper l'index.php et .htaccess à partir du répertoire public et collez-le dans le répertoire racine, c'est tout et remplacez deux lignes dans l'index.php comme

require __DIR__.'/bootstrap/autoload.php';
$app = require_once __DIR__.'/bootstrap/app.php';
40
répondu Muhammad Sadiq 2015-04-29 11:00:27

@rimon.ekjon a dit:

Renommez le serveur.php dans le dossier racine de votre Laravel à indexer.php et copier le .fichier htaccess du répertoire / public vers votre dossier racine Laravel. -- C'est ça !! :)

Ç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é asset () helper.

J'ai changé /Éclairer/Fondation/helpers.PHP / asset() fonctionne comme suit:

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

Maintenant tout fonctionne :)

Merci @ rimon.ekjon et à vous tous.

34
répondu Miron 2015-09-11 09:22:26

Dans Laravel 5.5 créer .fichier htacess dans votre répertoire racine et placé 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>
30
répondu Raham 2018-01-29 04:11:53

1) Je n'ai pas trouvé de méthode de travail pour déplacer le répertoire public dans L5. Alors que vous pouvez modifier certaines choses dans l'index bootstrap.php, il semble que plusieurs fonctions d'assistance soient basées sur l'hypothèse que ce répertoire public soit là. En tout honnêtement, vous ne devriez vraiment pas déplacer le répertoire public.

2) Si vous utilisez MAMP, vous devriez créer de nouveaux vhosts pour chaque projet, chacun desservant ce répertoire public de projets. Une fois créé, vous accédez à chaque projet nom de serveur défini. http://project1.dev, http://project2.dev

21
répondu Jeremy Schaffer 2015-02-08 01:38:43

Créez simplement .htaccess fichier à la racine et ajouter ces lignes

<IfModule mod_rewrite.c>
    RewriteEngine On

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

C'est ça!

Le code ci-dessus fonctionne sur le dossier racine public_html. Ayant dit que votre fichier laravel de base devrait être dans le dossier public_html, si votre répertoire ressemble à public_html / laravelapp / public et si vous mettez le code ci-dessus dans laravelapp cela ne fonctionnera pas. Par conséquent, vous devez copier tous vos fichiers de base dans public_html et mettre le .fichier htaccess là .

Si vous voulez conservez-le dans un sous-répertoire, alors vous pouvez créer un sous-domaine puis ce code fonctionne aussi.

14
répondu Abhinav Saraswat 2018-07-03 06:20:42

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

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

Étape 2 Ouvrir l'index.fichier php 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.

11
répondu piyush patel 2015-02-24 08:22:08

Disons que vous avez placé tous les autres fichiers et répertoires dans un dossier nommé 'locale'.

entrez la description de l'image ici

Il suffit d'aller à l'index.php et trouver 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';
10
répondu Angelo Joseph Salvador 2015-02-19 17:26:17

Je voudrais ajouter à @ Humble Learner et noter que l'emplacement approprié pour "réparer" le chemin d'url pour les ressources est /Illuminate / Routing / UrlGenerator.php/actif().

Mettre à jour la méthode pour correspondre à:

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'images. Rien d'actifs, des chemins d'accès.

6
répondu Sean Perkins 2015-11-02 03:10:56

Méthode 1:

Je viens de renommer server.php à index.php et il fonctionne

Méthode 2:

Ce travail bien pour tous laravel version...

Voici ma Structure de répertoire,

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

Suivez ces étapes simples

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

Exiger DIR.'/../ bootstrap / autoload.php';

À

Exiger DIR.'/bootstrap / autoload.php';

Et

$ app = require_once DIR .'/../ bootstrap / démarrer.php';

À

$ app = require_once DIR .'/bootstrap / démarrer.php';

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

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

À

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

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

6
répondu Wasim A. 2016-09-14 12:25:29

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

Ne pointez pas votre adresse ip/domaine vers le dossier racine de Laravel mais pointez-le vers le dossier public. Il est dangereux de pointer L'adresse Ip du serveur vers le dossier racine., car à moins d'écrire des restrictions dans .htaccess, on peut facilement accéder aux autres fichiers.,

Il suffit D'écrire la condition de réécriture dans le fichier .htaccess et d'installer rewrite module et activer le module de réécriture, le problème qui ajoute du public dans la route sera résolu.

3
répondu Reiah Paul Sam 2017-04-19 10:29:17

Pour que L'utilisateur XAMPP supprime le public de l'url sans toucher laravel, le système de fichiers par défaut consiste à définir un hôte virtuel pour votre application.]}

  1. Ouvrez L'application Panneau de configuration XAMPP et arrêtez Apache. Sachez que les machines Windows tardives peuvent l'exécuter en tant que service, cochez donc la case à gauche du module Apache.

  2. Accédez à C:/xampp/apache/conf/extra ou à l'endroit 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 trouvez # NameVirtualHost *:80 et décommentez ou supprimez le hachage.

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

<VirtualHost *>
    ServerAdmin admin@localhost.com
    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. Maintenant, vous pouvez copier et coller le code ci-dessus ci-dessous pour ajouter vos répertoires D'Hôtes Virtuels. Par exemple, je travaille sur un site appelé Eatery Engine, donc l'extrait suivant me permettra de travailler avec des sous-domaines sur mon installation locale:
<VirtualHost eateryengine.dev>
    ServerAdmin admin@localhost.com
    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, rendez-vous sur votre fichier hôte Windows pour modifier vos hôtes. le fichier sera situé à C:/Windows/System32/drivers/etc/hosts, où hosts est le fichier. L'ouvrir avec le bloc-notes.
  2. recherchez la résolution de nom # localhost est gérée dans le DNS lui-même.

127.0.0.1 localhost

La résolution du nom Localhost est gérée dans le 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 peut être trouvé ici

3
répondu sunny kashyap 2018-01-27 09:05:26

Même si ces solutions fonctionnent pour vous les gars, je vous demanderais de ne pas suivre cela. Voici la raison pour laquelle.

Vous devriez pointer votre racine D'hôte Apache vers le répertoire $LARAVEL_PATH/public au lieu de $LARAVEL_PATH.

Le point d'avoir un sous-répertoire pour www host root au lieu de project root est que vous ne divulguez aucun de vos fichiers de projet via votre serveur web.

Même si tous les fichiers PHP ont le suffixe de fichier .php, l'utilisateur malveillant peut accéder à votre $LARAVEL_PATH/storage répertoire et son contenu de sous-répertoire, lisez votre composer.json ou package.json pour trouver les dépendances vulnérables ou lire .env Fichier etc.

Si vous utilisez un hébergement partagé et que vous avez obligatoire public_html, essayez d'installer Laravel en dehors de ce répertoire public_html et supprimez public_html (si vide) et remplacez-le par un lien symbolique vers $LARAVEL_PATH/public ou si vous voulez que L'instance Laravel soit sous-répertoire de public_html, Faites de même, mais créez un lien symbolique de $LARAVEL_PATH/public à public_html/$PROJECT_SUBDIR.

Ce répertoire public est là pour une raison de rendre le projet un peu plus sécurisé. Résolvez le problème réel et n'essayez pas de casser cet ajout de sécurité simple mais agréable. :)

J'espère que cela aide.

3
répondu Mittul At TechnoBrave 2018-09-25 05:23:18

Tout d'Abord, vous pouvez utiliser ces étapes

Pour Laravel 5:

1. renommer le serveur.php dans votre dossier racine Laravel à indexer.php

2. Copiez le .fichier htaccess du répertoire / public vers 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.

Solution Proposition : Vous pouvez simplement modifier légèrement la fonction helpers::asset.

Pour ce:

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

  2. Aller à la ligne 130

  3. Écrire "public/".$path au lieu de $path,

    function asset($path, $secure = null){
       return app('url')->asset("public/".$path, $secure);
    }
    
1
répondu Ferhat KOÇER 2018-08-14 21:39:06

Une autre méthode que j'utilise est de créer un lien symbolique (sous Linux, Je ne connais pas Win) en utilisant la commande ln dans htdocs ou www, c'est-à-dire ln projectname/public project Le site est ainsi accessible via localhost / project

0
répondu Eli Makumba 2016-11-15 15:26:57

J'ai lu un article avant et ça marche bien mais je ne sais vraiment pas 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. 

Modifier l'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';
0
répondu Yousef Altaf 2017-02-10 15:31:52

Même si Je ne recommande pas de mettre Laravel sur le dossier racine, il y a des cas où cela n'a pas pu être évité; pour ces cas les méthodes ci dessus ne fonctionnent pas pour les actifs donc j'ai fait une solution rapide en changeant le htaccess: après la copie du serveur.php à indexer.PHP modifier 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 j'ai dû faire pour que tout le monde soit le bienvenu pour la mettre à jour.

0
répondu Plokko 2017-09-13 20:12:59
 You can follow only 2 step


 1- cut .htaccess from public folder and paste to root(mainFolder)  
 2- Rename server.php file to index.php AT your root dir. (mainFolder) 
0
répondu Yagnesh bhalala 2017-11-10 13:41:10

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, dans mon opinion personnelle , est "plus propre" que les autres que j'ai trouvé sur le Web.


Réalisations

  • N'a pas public MOT dans L'URI
  • protégez le fichier .env contre les curieux

Tout peut être fait en éditant simplement le .htaccess en utilisant {[5] } et quatre simples règle.


Étapes

  1. Déplacer le .htaccess fichier public/.htaccess dans la racine principale
  2. Modifier comme ci-dessous

J'ai tout commenté, donc il devrait être clair (j'espère) aussi à ceux qui n'ont jamais utilisé mod_rewrite (pas que je suis un expert, tout le contraire). Aussi, pour comprendre les règles, il doit être clair que, dans Laravel, si Bill se connecte à https://example.com, https://example.com/index.php est chargé. Ce fichier ne contient que la commande header("refresh: 5; https://example.com/public/"), qui envoie la requête à https://example.com/public/index.php. Cette seconde index.php est responsable 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 dans public/.htaccess) peut être supprimé. La même règle, en fait, est explicité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: {[19] } j'ai manqué la solution D'Abhinav Saraswat et sa réponse devrait être celle acceptée. Juste une règle simple et claire qui redirige tout le trafic vers le dossier public sans modifier aucun fichier.

0
répondu Brigo 2018-01-27 22:13:08

Étape 1: serveur.fichier php dans le répertoire racine, renommer comme index.php

Étape 2:

Copier .fichier htaccess du répertoire public à root direct

0
répondu Ravindra Bhanderi 2018-03-03 18:17:40

Voici la meilleure et la plus courte solution qui fonctionne pour moi à partir de mai 2018 pour Laravel 5.5

1-Il suffit de couper votre fichier .htaccess 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-Il suffit d'enregistrer le fichier .htaccess et c'est tout. Profitez!

0
répondu tony pro 2018-05-17 09:46:48