Comment puis-je supprimer «public / index.php» dans l'URL générée Laravel?


90

J'ai besoin de supprimer index.phpou public/index.phpde l'URL générée dans Laravel; généralement le chemin est localhost/public/index.php/someWordForRoute, il devrait être quelque chose commelocalhost/someWordForRoute.

.htaccess

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

RewriteEngine On

# Redirect Trailing Slashes.
RewriteRule ^(.*)/$ /$1 [L,R=301]

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

app / config / app.php

'url' => 'http://localhost',

Comment puis-je changer cela?


7
Jolies URL à Laravel . Assurez-vous que mod_rewriteest activé.
Kryten


@Kryten ne fonctionne pas = /
TuGordoBello

2
C'est la solution lorsque l'autre solution ne fonctionne pas dev-metal.com/enable-mod_rewrite-ubuntu-14-04-lts
TuGordoBello

La racine de votre document pointe-t-elle vers le dossier prévu, c'est/var/www/project_name/public
Kiee

Réponses:


129

Option 1: utiliser .htaccess

S'il n'y est pas déjà, créez un fichier .htaccess dans le répertoire racine de Laravel. Créez un .htaccessfichier dans votre répertoire racine Laravel s'il n'existe pas déjà. (Normalement, c'est sous votre public_htmldossier)

Modifiez le fichier .htaccess afin qu'il contienne le code suivant:

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

Vous devriez maintenant pouvoir accéder au site Web sans la partie "/public/index.php/".

Option 2: déplacer des éléments du répertoire '/ public' vers le répertoire racine

Créez un nouveau dossier dans votre répertoire racine et déplacez tous les fichiers et dossiers à l'exception du dossier public. Vous pouvez l'appeler comme vous le souhaitez. J'utiliserai "laravel_code".

Ensuite, déplacez tout hors du répertoire public et dans le dossier racine. Cela devrait aboutir à quelque chose de similaire à ceci: entrez la description de l'image ici

Après cela, tout ce que nous avons à faire est de modifier les emplacements dans le laravel_code/bootstrap/paths.phpfichier et le index.phpfichier.

Dans laravel_code/bootstrap/paths.phprecherchez la ligne de code suivante:

'app' => __DIR__.'/../app',
'public' => __DIR__.'/../public',

Et changez-les en:

'app' => __DIR__.'/../app',
'public' => __DIR__.'/../../',

Dans index.php, trouvez ces lignes:

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

Et changez-les en:

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

Source: Comment supprimer / public / de l'URL dans Laravel


5
Si vous utilisez Debian Linux, ne pas oublier de modifier l' etc/apache2/apache2.confévolution de AllowOverride Nonela AllowOverride Alloù vous voyez la configuration d'annuaire, <Directory /var/www/></Directory>.
Robin Hood

1
Je n'avais qu'à avoir le fichier .htaccess dans mon répertoire racine pour le faire fonctionner.
Mário Rodrigues le

8
Passer à / root n'est pas du tout un bon conseil en mode production! Il y a une raison pour laquelle le dossier public existe
toesslab

Pour vous assurer que les règles de réécriture fonctionnent, vérifiez que la configuration de <Directory ...configuration d' Apache contient AllowOverride All'quelque chose comme ceci: <Directory "/var/www/html/laravel/public"> Options Indexes FollowSymLinks MultiViews **AllowOverride All** </Directory>
Japheth Ongeri - inkalimeva

Et si je n'ai pas d'accès conf sur l'hébergement?
Peter

40

J'ai essayé ceci sur Laravel 4.2

Renommez le server.phpdans le dossier racine de votre Laravel index.phpet copiez le .htaccessfichier du /publicrépertoire vers votre dossier racine Laravel.

J'espère que ça marche


1
Si la réponse acceptée par Luazan ne fonctionne pas, cela suffira. Bien que je m'assure de modifier le fichier index.php dans le dossier public pour rediriger les utilisateurs hors du public s'ils accèdent directement à ce lien.
Brad Bird

4
Les fichiers js et css ne sont plus chargés à partir du dossier public
llio ou

@MaHDyfo - pourquoi ce n'est pas sécurisé? et comment ?
151291

2
@ 151291 car le fichier .env est accessible à tous et visite votre site de cette façon. sauf si vous sécurisez votre serveur Web pour éviter cela.
Mahdyfo

17

Ne vous méprenez pas avec une autre option, l'extrait ci-dessous que j'utilise et vous sera également utile. Mettez les htacces ci-dessous dans votre racine.

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

Accédez à votre répertoire public et mettez un autre fichier htaccess avec l'extrait de code ci-dessous

<IfModule mod_rewrite.c>
    RewriteEngine On
    # Removes index.php from ExpressionEngine URLs  
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php?url=$1 [PT,L]

</IfModule>

Ça marche... !!!

Laravel utilise ci-dessous .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]

Génial: pouvez-vous me dire quels sont les avantages et les inconvénients de cette méthode?
Muhammad Ateek

J'ai seulement édité le .htaccess en root (votre premier extrait de code) et cela l'a corrigé pour moi, merci!
peird

13

VOICI DES ÉTAPES SIMPLES POUR SUPPRIMER PUBLIC IN URL (Laravel 5)

1: Copiez tous les fichiers du dossier public et collez-les dans le dossier racine de laravel

2: Ouvrez index.php et modifiez

De

 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';

Dans laravel 4, le chemin 2 est $app = require_once __DIR__.'/bootstrap/start.php';au lieu de$app = require_once __DIR__.'/bootstrap/app.php';/app.php

C'est ça.


Y a-t-il d'autres complications concernant d'autres liens à partir du site?
Haring10

Cela ressemble à une excellente solution et simple aussi. Mais vraiment, comme l'a dit Haring10. Y a-t-il des problèmes avec cela?
Peter

10

1) Vérifiez si mod_rewrite est activé. Allez dans le /etc/apache2/mods-enabledrépertoire et voyez si le rewrite.loadest disponible. Sinon, activez-le à l'aide de la commande sudo a2enmod rewrite. Cela activera le module de réécriture. S'il est déjà activé, il affichera le message Module rewrite already enabled.
2) Créez un hôte virtuel pour le répertoire public afin qu'au lieu de donner, http://localhost/public/index.phpnous puissions l'utiliser comme ça http://example.com/index.php. [donc le nom du dossier public sera masqué]
3) Ensuite, créez un .htaccess qui masquera l'index.php de votre url qui doit être dans le répertoire racine (dossier public)

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?/$1 [L]

1
J'ai essayé vos pas. Pas encore de résultat! Je ne sais pas pourquoi cela se produit!
Mostafiz Rahman

Donnez les informations du journal afin que nous puissions retracer la cause première
Orchid


travaillé pour moi. Ne faites pas passer l'hôte virtuel directement dans le dossier public.
cardi777

Merci. Cela a fonctionné pour moi, j'étais mod_rewritehandicapé.
Maubeh

5

Cela n'a probablement que très peu à voir avec Laravel et tout à voir avec vos configurations Apache.

Avez-vous accès à la configuration de votre serveur Apache? Si tel est le cas, vérifiez ceci dans la documentation:

En général, vous ne devez utiliser les fichiers .htaccess que lorsque vous n'avez pas accès au fichier de configuration du serveur principal. Il y a, par exemple, une idée fausse courante selon laquelle l'authentification des utilisateurs devrait toujours être effectuée dans les fichiers .htaccess, et, ces dernières années, une autre idée fausse selon laquelle les directives mod_rewrite doivent aller dans les fichiers .htaccess. Ce n'est simplement pas le cas. Vous pouvez placer les configurations d'authentification des utilisateurs dans la configuration du serveur principal, et c'est en fait la meilleure façon de faire les choses. De même, les directives mod_rewrite fonctionnent mieux, à bien des égards, dans la configuration du serveur principal.

... En général, l'utilisation de fichiers .htaccess doit être évitée lorsque cela est possible. Toute configuration que vous envisagez de mettre dans un fichier .htaccess peut tout aussi bien être effectuée dans une section de votre fichier de configuration de serveur principal.

Source: documentation Apache .

La raison pour laquelle je mentionne cela en premier est qu'il est préférable de s'en débarrasser .htaccesscomplètement si vous le pouvez et d'utiliser une Directorybalise à l'intérieur d'une VirtualHostbalise. Cela étant dit, le reste supposera que vous vous en tenez à l' .htaccessitinéraire pour une raison quelconque.

Pour décomposer cela, plusieurs choses pourraient se produire:

  1. Je note, peut-être inutile, que votre dossier est nommé .htaccesdans votre question. Je suppose que c'est une faute de frappe, mais si vous l'avez négligée et qu'il manque en fait la seconde, c'est exactement le genre d'erreur mineure qui me laisserait me cogner la tête contre le mur à la recherche de quelque chose de plus difficile. .

  2. Votre serveur ne peut pas autoriser .htaccess. Pour vérifier cela, accédez à votre fichier de configuration Apache. Dans les versions Apache modernes, ce n'est généralement pas dans un fichier de configuration, alors assurez-vous que vous utilisez celui qui pointe vers votre application, où qu'elle existe. Changement

    AllowOverride none
    

    à

    AllowOverride all
    

    En guise de suivi, les documents Apache recommandent également, pour des raisons de sécurité, de ne pas le faire pour chaque dossier si vous .htaccessenvisagez de réécrire. À la place, faites-le pour les dossiers auxquels vous devez ajouter .htaccess.

  3. Avez-vous mod_rewriteactivé? Cela pourrait être à l'origine des problèmes. Je remarque que vous avez l'étiquette en haut <IfModule mod_rewrite.c>. Essayez de commenter ces balises et redémarrez Apache. Si vous obtenez une erreur, c'est probablement parce que vous devez activer mod_rewrite: Comment activer mod_rewrite pour Apache 2.2

J'espère que cela t'aides. J'ai cité certains des problèmes les plus courants, mais il y en a plusieurs autres qui pourraient être plus banals ou uniques. Une autre suggestion sur un serveur de développement? Réinstallez Apache. Si possible, faites-le à partir d'une source différente avec un bon tutoriel.


Excellente prise pour les paramètres de configuration apache2, ce paramètre me manque à chaque fois.
Abhishek

4

Pour Laravel 4 & 5:

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

C'est ça !! :)


2

Assurez-vous également que Rewrite Engline est activé après la modification du fichier .htaccess

sudo a2enmod rewrite

Bonne observation, j'étais sur un nouveau serveur et j'ai dû l'activer (et ajouter les bits nécessaires dans la configuration d'Apache également) en utilisant ce digitalocean.com/community/tutorials
...

1

Laravel est déjà livré avec une jolie URL .htaccess ... vous devriez être prêt à sortir de la boîte ... http://laravel.com/docs/installation#pretty-urls

Assurez-vous que mod_rewrite est activé et que votre chemin d'accès personnel est défini sur le répertoire public de votre application.


J'ai activé mod_rewriteet j'ai copié le code qui se trouve sur cette page et toujours sans travaux
TuGordoBello

1
Assurez-vous que dans Apache, votre chemin est défini sur le dossier public de votre application.
Kisuka

ServerAdmin webmaster@localhost DocumentRoot /home/web-apps/myproject/public
TuGordoBello

Avez-vous redémarré Apache après avoir activé mod_rewrite?
Kisuka

J'ai un dossier appelé userest l'endroit où je garde les photos, aussi j'ai un fichier lame appelé user, quand j'écris dans l'URL myproject.com/userme montre le contenu du dossier, les images
TuGordoBello

1

Pour ce faire, vous devez effectuer les étapes suivantes, qui sont les suivantes

  • Mappez votre domaine vers le dossier public de votre projet (par exemple / var / www / html / yourproject / public) (si vous utilisez Linux)

  • Accédez à votre dossier public, modifiez-y votre .htaccessfichier

AddHandler application/x-httpd-php72 .php
<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 non-www to www
    RewriteCond %{HTTP_HOST} !^www\.
    RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

    # Redirect non-http to https
    RewriteCond %{HTTPS} off
    RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

    # 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]

    # Remove index.php
    RewriteCond %{THE_REQUEST} ^GET.*index\.php [NC]
    RewriteRule (.*?)index\.php/*(.*) /$1$2 [R=301,NE,L]
</IfModule>


  • Les trois dernières règles s'appliquent si vous accédez directement à une route sans https, cela protège cela.

0
 RewriteEngine on

 RewriteCond %{REQUEST_FILENAME} !-f
 RewriteCond %{REQUEST_FILENAME} !-d

 RewriteRule ^(.*)$ index.php/$1 [L]

utilisez ceci dans .htaccess et redémarrez le serveur


0

J'espère que cela aide comme ça l'a fait pour moi.

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

0

Je viens d'installer Laravel 5 pour un projet et il y a un fichier à la racine appelé server.php.

Changez-le en index.phpet cela fonctionne ou tapez le terminal:

$cp server.php index.php

0

Renommez le server.phpdans le dossier racine de votre Laravel index.phpet copiez le .htaccessfichier du /publicrépertoire vers votre dossier racine Laravel.



0

Si vous utilisez IIS Windows Server, ajoutez un web.configfichier dans le dossier racine et mettez le code ci-dessous:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="Imported Rule 1" stopProcessing="true">
                    <match url="^(.*)$" ignoreCase="false" />
                    <conditions logicalGrouping="MatchAll">
                        <add input="{URL}" pattern="^system.*" ignoreCase="false" />
                    </conditions>
                    <action type="Rewrite" url="/index.php/{R:1}" />
                </rule>
                <rule name="Imported Rule 2" stopProcessing="true">
                    <match url="^(.*)$" ignoreCase="false" />
                    <conditions logicalGrouping="MatchAll">
                        <add input="{REQUEST_FILENAME}" matchType="IsFile" ignoreCase="false" negate="true" />
                        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" ignoreCase="false" negate="true" />
                        <add input="{R:1}" pattern="^(index\.php|images|robots\.txt|css)" ignoreCase="false" negate="true" />
                    </conditions>
                    <action type="Rewrite" url="index.php/{R:1}" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>

et si vous utilisez, .htaccess utilisez celui-ci:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]

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

3
Fournit plus d'explications à votre solution
Naruto

-3

Selon Laravel 5.3 les choses ci-dessus ne fonctionneront pas correctement, mais soyez calme et suivez les étapes ci-dessous:

Étape 1. Allez à l'intérieur du projet laravel
Étape 2. Créez un répertoire / dossier aléatoire, par exemple. laravelcode
Étape 3. Déplacez tous les dossiers et fichiers (sauf le dossier public )
Étape 4. Déplacez tous les dossiers et fichiers qui se trouvent dans le dossier public vers le projet laravel
Étape 5. Maintenant, dans le projet laravel, il y a un fichier index.php, veuillez ouvrez-le et changez les chemins de dossier pour bootstrap comme par le nouveau chemin comme précédemment c'était "require DIR . '/ .. / bootstrap / autoload.php';" maintenant il deviendra "exiger DIR . '/ laravelcode / bootstrap / autoload.php';"

Voilà, lancez simplement votre URL sans public et index.php comme ci-dessous http: // localhost / blog /

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.