php get current - Laravel 5 - Supprimer le public de l'URL




10 Answers

Pour Laravel 5:

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

C'est tout !! :)

parameters url::to

Je sais que c'est une question très populaire mais je n'ai pas été capable de trouver une solution de travail pour Laravel 5. J'ai essayé de migrer depuis Codeigniter depuis longtemps, mais ce processus d'installation alambiqué ne cesse de me rebuter.

Je ne veux pas faire fonctionner une VM, cela me semble bizarre quand je change de projet.

Je ne veux pas mettre mon document racine dans le dossier public, c'est aussi gênant lors d'un changement de projet.

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 exception Laravel NotFoundHttpException dans la ligne 7610 compiled.php.

Lorsque j'ai essayé L4 il y a un certain temps, 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 complètement cassé Laravel (le serveur ne retournerait qu'une page blanche).

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

  1. Fonctionne avec L5
  2. Permet de passer facilement d'un projet à l'autre (je travaille habituellement sur 2 ou 3 à la fois).

Merci

** J'utilise MAMP et PHP 5.6.2




Un moyen facile de retirer le public de laravel 5 url. Vous avez juste besoin de couper index.php et .htaccess du répertoire public et le coller dans le répertoire racine, c'est tout et remplacer deux lignes dans index.php comme

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



1) Je n'ai pas trouvé de méthode de travail pour déplacer le répertoire public dans L5. Bien que vous puissiez modifier certaines choses dans le bootstrap index.php, il semble que plusieurs fonctions auxiliaires reposent sur l'hypothèse que ce répertoire public soit présent. En toute honnêteté, vous ne devriez vraiment pas déplacer le répertoire public.

2) Si vous utilisez MAMP, alors vous devriez créer de nouveaux vhosts pour chaque projet, chaque portion qui projette le répertoire public. Une fois créé, vous accédez à chaque projet par votre nom de serveur défini. http://project1.dev , http://project2.dev




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

Allez simplement sur 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';



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

<IfModule mod_rewrite.c>
    RewriteEngine On

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

C'est tout!




MÉTHODE 1:

Je viens de renommer server.php en index.php et ça marche

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, donc optionnellement vous pouvez le supprimer maintenant
  3. Maintenant, ouvrez index.php et effectuez les remplacements suivants

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

à

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

et

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

à

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

  1. Maintenant, ouvrez 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 /




Pour l'utilisateur XAMPP de supprimer public de l'URL sans toucher au système de fichiers par défaut Laravel est de définir un hôte virtuel pour votre application pour ce faire, suivez ces étapes

  1. Ouvrez l'application du panneau de configuration XAMPP et arrêtez Apache. Sachez que les ordinateurs Windows récents peuvent l'exécuter en tant que service, cochez la case située à gauche du module Apache.

  2. Accédez à C:/xampp/apache/conf/extra ou l'emplacement de 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 [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-dessous pour ajouter vos répertoires d'hôtes virtuels. Par exemple, je travaille sur un site appelé Eatery Engine afin que l'extrait suivant me permette 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 éditer vos HOSTS. le fichier sera situé dans C:/Windows/System32/drivers/etc/hosts , où hosts est le fichier. Ouvrez-le avec le bloc-notes.
  2. Rechercher la résolution de nom #localhost est géré 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é here




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




Même si je ne recommande pas de mettre Laravel sur le dossier racine, il y a des cas où cela ne peut pas être évité; pour ces cas, les méthodes ci-dessus ne fonctionnent pas pour les actifs, donc j'ai fait une correction rapide en changeant le htaccess: après avoir copié server.php à 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 j'ai dû faire, donc tout le monde est le bienvenu pour le mettre à niveau.




Laravel 5,5

Après avoir installé Laravel pour la première fois, j'ai fait face au fameux "problème des dossiers publics" et j'ai trouvé cette solution qui, selon moi, est "plus propre" que les autres que j'ai trouvées sur le Web.

Réalisations

  • Ne pas avoir public mot public dans l'URI
  • Protéger le fichier .env contre les personnes curieuses

Tout peut être fait juste en éditant le .htaccess utilisant mod_rewrite et quatre règles simples.

Pas

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

J'ai commenté tout, donc ça devrait être clair (j'espère) aussi à ceux qui n'ont jamais utilisé mod_rewrite (pas que je sois 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 contient uniquement l'en- header("refresh: 5; https://example.com/public/") commande header("refresh: 5; https://example.com/public/") , qui envoie la requête à https://example.com/public/index.php . Ce second index.php est chargé de charger le contrôleur et d'autres choses.

# 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ée. La même règle, en fait, 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: La solution d' Abhinav Saraswat m'a manqué et sa réponse devrait être acceptée. Juste une règle simple et claire qui redirige tout le trafic vers le dossier public sans modifier aucun fichier.




Related