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:
- Fonctionne avec L5
- 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
22 réponses
Pour Laravel 5:
- renommez
server.php
dans votre dossier racine Laravel enindex.php
- Copiez le fichier
.htaccess
du répertoire/public
vers votre racine Laravel dossier.
C'est ça !! :)
, j'ai résolu le problème en utilisant 2 réponses:
- renommer le serveur.php à indexer.php (aucune modification)
- Copiez le .htaccess du dossier public au dossier racine (comme rimon.ekjon dit ci-dessous)
-
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
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';
@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.
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>
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
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.
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.
Disons que vous avez placé tous les autres fichiers et répertoires dans un dossier nommé 'locale'.
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';
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.
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
- déplace tous les fichiers du répertoire public vers root / laravel /
- maintenant, pas besoin de répertoire public, donc éventuellement vous pouvez le supprimer maintenant
- 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';
- 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 /
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.
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.]}
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.
Accédez à
C:/xampp/apache/conf/extra
ou à l'endroit où se trouvent vos fichiers XAMPP.Ouvrez le fichier nommé httpd-vhosts.conf avec un éditeur de texte.
Autour de la ligne 19 trouvez #
NameVirtualHost *:80
et décommentez ou supprimez le hachage.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>
- 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>
- 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. - 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.
- redémarrez Apache et testez tout.
L'article original peut être trouvé ici
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.
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:
Ouvert
vendor\laravel\framework\src\Illuminate\Foundation\helpers.php
Aller à la ligne 130
-
Écrire
"public/".$path
au lieu de$path
,function asset($path, $secure = null){ return app('url')->asset("public/".$path, $secure); }
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
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';
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.
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)
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
- Déplacer le
.htaccess
fichierpublic/.htaccess
dans la racine principale - 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.
É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
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!