Cum pot elimina „public/index.php” în URL-ul generat Laravel? (Programare, Php,.Htaccess, Laravel, Laravel 4, Laravel Routing)

TuGordoBello a intrebat.

Am nevoie să elimin index.php sau public/index.php din URL-ul generat în Laravel; în mod obișnuit calea este localhost/public/index.php/someWordForRoute, , Ar trebui să fie ceva de genul localhost/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',

Cum pot schimba asta?

Comentarii

  • URL-uri frumoase în Laravel. Asigurați-vă că mod_rewrite este activată. –  > Por Kryten.
  • stackoverflow.com/questions/21662378/… –  > Por The Alpha.
  • @Kryten doesnt work =/ – –  > Por TuGordoBello.
  • Aceasta este soluția atunci când cealaltă soluție nu funcționează dev-metal.com/enable-mod_rewrite-ubuntu-14-04-lts –  > Por TuGordoBello.
  • Rădăcina documentului dvs. este îndreptată către folderul dorit, adică /var/www/project_name/public –  > Por Kiee.
17 răspunsuri
Luzan Baral

Opțiunea 1: Folosiți .htaccess

Dacă nu este deja acolo, creați un fișier .htaccess în directorul rădăcină Laravel.Creați un fișier .htaccess fișier în directorul rădăcină Laravel dacă nu există deja. (În mod normal, acesta se află sub public_html folder)

Modificați fișierul .htaccess astfel încât să conțină următorul cod:

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

Acum ar trebui să puteți accesa site-ul web fără partea „/public/index.php/”.

Opțiunea 2 : Mutați lucrurile din directorul „/public” în directorul rădăcină

Creați un nou dosar în directorul rădăcină și mutați toate fișierele și dosarele, cu excepția dosarului public. Îl puteți numi cum doriți. Eu voi folosi „laravel_code”.

Apoi, mutați totul din directorul public în folderul rădăcină. Ar trebui să rezulte ceva oarecum asemănător cu acest lucru:

După aceea, tot ce trebuie să facem este să modificăm locațiile din fișierul laravel_code/bootstrap/paths.php și în fișierul index.php fișier.

În laravel_code/bootstrap/paths.php găsiți următoarea linie de cod:

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

Și schimbați-le în:

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

În index.php, , găsiți aceste linii:

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

Și modificați-le în:

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

Sursa: Cum să eliminați /public/ din URL în Laravel

Comentarii

  • Dacă folosiți Debian Linux, nu uitați să editați etc/apache2/apache2.conf schimbând din AllowOverride None în AllowOverride All unde vedeți configurația Directory, <Directory /var/www/></Directory> . –  > Por Robin Hood.
  • A trebuit doar să am fișierul .htaccess în directorul meu rădăcină pentru ca totul să funcționeze. –  > Por Mário Rodrigues.
  • Mutarea în /root nu este deloc un sfat bun în modul de producție! Există un motiv pentru care există folderul public –  > Por toesslab.
  • Pentru a vă asigura că regulile de rescriere funcționează, verificați dacă în configurația apache <Directory ... config are AllowOverride All' ceva de genul acesta: <Directory "/var/www/html/laravel/public"> Options Indexes FollowSymLinks MultiViews **AllowOverride All** </Directory> –  > Por Japheth Ongeri – inkalimeva.
  • Ce se întâmplă dacă nu am acces la conf pe hosting? –  > Por Peter.

Am încercat acest lucru pe Laravel 4.2

Redenumiți fișierul server.php în folderul rădăcină Laravel în index.php și copiați fișierul .htaccess din /public în dosarul rădăcină Laravel.

Sper că funcționează

Comentarii

  • Dacă răspunsul acceptat de Luazan nu funcționează, atunci acesta va fi suficient. Deși m-aș asigura să editez fișierul index.php din folderul public pentru a redirecționa utilizatorii în afara domeniului public dacă merg direct la acel link. –  > Por Brad Bird.
  • Fișierele js și css nu mai sunt încărcate din folderul public –  > Por llioor.
  • @MaHDyfo – de ce nu este securizat ? și cum ? –  > Por 151291.
  • @151291 pentru că fișierul .env este accesibil tuturor celor care vă vizitează site-ul în acest mod. dacă nu vă securizați serverul web pentru a evita acest lucru. –  > Por Mahdyfo.
Ankit Vishwakarma

Nu vă confundați cu altă opțiune extrasul de mai jos pe care îl folosesc și va fi util și pentru dvs. puneți htaccesul de mai jos în rădăcină.

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

Mergeți în directorul dvs. public și puneți un alt fișier htaccess cu fragmentul de cod de mai jos

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

Funcționează… !!!

Laravel utilizează fișierul .htaccess de mai jos

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

Comentarii

  • Grozav: îmi puteți spune care sunt avantajele și dezavantajele acestei metode? –  > Por Muhammad Ateek.
  • Am editat doar .htaccess în rădăcină (primul tău fragment) și asta a rezolvat-o pentru mine, mulțumesc! –  > Por Peird.
Orchid

1) Verificați dacă mod_rewrite este activat. Mergeți la /etc/apache2/mods-enabled și vedeți dacă directorul rewrite.load este disponibil. Dacă nu, activați-l cu ajutorul comenzii sudo a2enmod rewrite.aceasta va activa modulul de rescriere. Dacă este deja activat, se va afișa mesajul Module rewrite already enabled.
2)Creați o gazdă virtuală pentru directorul public, astfel încât, în loc de a da http://localhost/public/index.php vom putea folosi astfel http://example.com/index.php. [prin urmare, numele directorului public va fi ascuns].
3)Apoi creați un .htaccess care va ascunde index.php din url-ul dvs. care ar trebui să fie în interiorul directorului rădăcină (folderul public).

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

Comentarii

  • Am încercat pașii dvs. Încă nu am obținut niciun rezultat! Nu înțeleg de ce se întâmplă acest lucru! –  > Por Mostafiz Rahman.
  • Dați-ne informațiile din jurnal, astfel încât să putem depista cauza principală –  > Por Orchid.
  • Iată fișierul jurnal complet: dropbox.com/s/8fhlbej86nqr5qj/laravel.log?dl=0 –  > Por Mostafiz Rahman.
  • a funcționat pentru mine. Nu faceți ca gazda virtuală să meargă direct în folderul public. –  > Por cardi777.
  • Vă mulțumesc. Acest lucru a funcționat pentru mine. mod_rewrite a fost dezactivat. –  > Por Maubeh.
Khandad Niazi

Iată pașii simpli pentru a elimina PUBLICUL din URL (Laravel 5)

1: Copiați toate fișierele din dosarul public și lipiți-le în dosarul rădăcină al lui Laravel

2: Deschideți index.php și schimbați

De la

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

To

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

Și

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

La

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

În laravel 4 calea 2 este $app = require_once __DIR__.'/bootstrap/start.php'; în loc de $app = require_once __DIR__.'/bootstrap/app.php';/app.php

Asta este tot.

Comentarii

  • Există și alte complicații în ceea ce privește alte legături de pe site? –  > Por Haring10.
  • Pare o soluție excelentă și simplă, de asemenea. Dar, într-adevăr, așa cum a spus Haring10. Există vreo problemă cu acest lucru? –  > Por Peter.
smcjones

Probabil că acest lucru are foarte puțin de-a face cu Laravel și totul are legătură cu configurațiile Apache.

Aveți acces la configurația serverului Apache? Dacă da, verificați acest lucru, din documente:

În general, ar trebui să folosiți fișiere .htaccess numai atunci când nu aveți acces la fișierul principal de configurare a serverului. Există, de exemplu, o concepție greșită comună conform căreia autentificarea utilizatorilor trebuie să se facă întotdeauna în fișierele .htaccess și, în ultimii ani, o altă concepție greșită conform căreia directivele mod_rewrite trebuie să fie în fișierele .htaccess. Pur și simplu nu este cazul. Puteți pune configurațiile de autentificare a utilizatorilor în configurația principală a serverului și aceasta este, de fapt, modalitatea preferată de a face lucrurile. De asemenea, directivele mod_rewrite funcționează mai bine, în multe privințe, în configurația principală a serverului.

… În general, utilizarea fișierelor .htaccess ar trebui evitată atunci când este posibil. Orice configurație pe care ați avea în vedere să o puneți într-un fișier .htaccess, poate fi la fel de eficient realizată într-o secțiune din fișierul principal de configurare a serverului.

Sursă: Documentația Apache.

Motivul pentru care menționez acest lucru în primul rând este că este mai bine să scăpați de .htaccess complet, dacă se poate, și să folosiți un fișier Directory în interiorul unei etichete VirtualHost tag. Acestea fiind spuse, în restul acestui articol se va presupune că veți folosi .htaccess traseul pentru orice motiv.

Pentru a descompune acest lucru, se pot întâmpla câteva lucruri:

  1. Am observat, poate fără rost, că fișierul tău se numește .htacces în întrebarea dumneavoastră. Presupun că este o greșeală de scriere, dar în cazul în care ați trecut cu vederea și, de fapt, lipsește doar al doilea s, este exact genul de eroare minoră care m-ar lăsa să mă dau cu capul de perete în căutarea a ceva mai provocator.

  2. Serverul dvs. nu poate permite .htaccess. Pentru a verifica acest lucru, mergeți la fișierul de configurare Apache. În construcțiile moderne Apache, de obicei, acest lucru nu se află într-un singur fișier de configurare, așa că asigurați-vă că îl utilizați pe cel care indică aplicația dvs., oriunde ar exista. Modificați

    AllowOverride none
    

    în

    AllowOverride all
    

    Ca o continuare, documentele Apache recomandă, de asemenea, ca, din motive de securitate, să nu faceți acest lucru pentru fiecare dosar dacă aveți de gând să alegeți .htaccess pentru rescriere. În schimb, faceți-o pentru dosarele pe care trebuie să le adăugați .htaccess la.

  3. Aveți mod_rewrite activate? Asta ar putea cauza problemele. Am observat că aveți eticheta în partea de sus <IfModule mod_rewrite.c>. Încercați să comentați aceste etichete și reporniți Apache. Dacă primiți o eroare, probabil că este din cauză că trebuie să activați mod_rewrite:Cum se activează mod_rewrite pentru Apache 2.2

Sper că vă ajută. Am numit unele dintre cele mai comune probleme, dar mai sunt și altele care ar putea fi mai banale sau unice. O altă sugestie pe un server dev? Reinstalați Apache. Dacă este posibil, faceți acest lucru de la o sursă diferită cu un tutorial bun.

Comentarii

  • Mare captură pentru setările de configurare apache2, îmi lipsește această setare de fiecare dată. –  > Por Abhishek.
Abhijeet Navgire

Pentru Laravel 4 & 5:

  1. Redenumiți server.php în dosarul rădăcină Laravel în index.php
  2. Copiați .htaccess din /public în directorul Laravel root folder.

Asta e tot!!! 🙂

Rafik Bari

De asemenea, asigurați-vă că Rewrite Engline este activat după editarea fișierului .htaccess

sudo a2enmod rewrite

Comentarii

  • Bună observație Am fost pe un server nou și de fapt a trebuit să o activez (și să adaug și biții necesari în configurația apache) folosind acest lucru digitalocean.com/community/tutorials/… –  > Por cdsaenz.
Kisuka

Laravel se livrează cu un URL .htaccess destul de frumos deja… ar trebui să puteți ieși din cutie…http://laravel.com/docs/installation#pretty-urls

Asigurați-vă că mod_rewrite este activat și că calea dvs. de pornire este setată la directorul public al aplicației dvs.

Comentarii

  • Eu am activat mod_rewrite și am copiat codul de pe acea pagină și tot nu funcționează.  > Por TuGordoBello.
  • Asigură-te că în Apache calea ta este setată la directorul public al aplicației tale. –  > Por Kisuka.
  • ServerAdmin [email protected] DocumentRoot /home/web-apps/myproject/public –  > Por TuGordoBello.
  • Ați repornit apache după ce ați activat mod_rewrite? –  > Por Kisuka.
  • Am un folder numit user este locul unde țin fotografiile, de asemenea am un fișier blade numit user , când scriu în URL myproject.com/user îmi arată conținutul folderului, fotografiile –  > Por TuGordoBello.
Shahrukh Anwar

Trebuie să efectuați următorii pași pentru a face acest lucru, care sunt următoarele

  • Mapați domeniul dvs. până la folderul public al proiectului dvs. (adică /var/www/html/yourproject/public) (dacă folosiți linux)

  • Mergeți în folderul public și editați .htaccess acolo

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>


  • Ultimele trei reguli sunt pentru cazul în care accesați direct orice traseu fără https, , acesta protejează acest lucru.

Arun
 RewriteEngine on

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

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

utilizați acest lucru în .htaccess și reporniți serverul.

Harry Bosh

Sper că acest lucru ajută așa cum a făcut-o pentru mine.

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

Samuel Kwame Antwi

Tocmai am instalat Laravel 5 pentru un proiect și există un fișier în rădăcină numit server.php.

Schimbați-l în index.php și funcționează sau tastați în terminal:

$cp server.php index.php

Rizwan Taj

Redenumiți fișierul server.php din folderul rădăcină Laravel la index.php și copiați fișierul .htaccess din /public în dosarul rădăcină Laravel.

Cristianetoo Geova
Abd Abughazaleh

Dacă folosiți IIS Windows Server, adăugați web.config în folderul rădăcină și puneți codul de mai jos :

<?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>

și dacă folosiți .htaccess folosiți-l pe acesta :

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

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

Comentarii

  • Mai multe explicații pentru soluția dumneavoastră –  > Por Naruto.