Jak mogę usunąć „public / index.php” w generowanym adresie URL Laravel?

90

Muszę usunąć index.phplub public/index.phpz wygenerowanego adresu URL w Laravel; Powszechnie ścieżka jest taka localhost/public/index.php/someWordForRoute, że powinno być coś takiegolocalhost/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',

Jak mogę to zmienić?

TuGordoBello
źródło
7
Ładne adresy URL w Laravel . Upewnij się, że mod_rewritejest włączona.
Kryten
@Kryten doesnt work = /
TuGordoBello
2
To jest rozwiązanie, gdy inne rozwiązanie nie działa dev-metal.com/enable-mod_rewrite-ubuntu-14-04-lts
TuGordoBello
Czy katalog główny Twojego dokumentu wskazuje na właściwy folder, tj./var/www/project_name/public
Kiee

Odpowiedzi:

129

Opcja 1: Użyj .htaccess

Jeśli go tam nie ma, utwórz plik .htaccess w katalogu głównym Laravel. Utwórz .htaccessplik w katalogu głównym Laravel, jeśli jeszcze nie istnieje. (Zwykle jest pod twoim public_htmlfolderem)

Edytuj plik .htaccess tak, aby zawierał następujący kod:

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

Teraz powinieneś mieć dostęp do witryny bez części „/public/index.php/”.

Opcja 2: Przenieś rzeczy z katalogu „/ public” do katalogu głównego

Utwórz nowy folder w katalogu głównym i przenieś wszystkie pliki i foldery z wyjątkiem folderu publicznego. Możesz to nazwać, jak chcesz. Użyję „laravel_code”.

Następnie przenieś wszystko z katalogu publicznego do folderu głównego. Powinno to spowodować coś podobnego do tego: wprowadź opis obrazu tutaj

Następnie wszystko, co musimy zrobić, to edytować lokalizacje w laravel_code/bootstrap/paths.phppliku i index.phppliku.

W laravel_code/bootstrap/paths.phpodnaleźć następujący wiersz kodu:

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

I zmień je na:

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

W programie index.phpznajdź te wiersze:

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

I zmień je na:

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

Źródło: Jak usunąć / public / z adresu URL w Laravel

Luzan Baral
źródło
5
Jeśli używasz Debiana, nie zapomnij, aby edytować etc/apache2/apache2.confzmieniającym się od AllowOverride Nonecelu AllowOverride All, gdzie można zobaczyć config Directory <Directory /var/www/></Directory>.
Robin Hood
1
Musiałem tylko mieć plik .htaccess w moim katalogu głównym, aby działał.
Mário Rodrigues
8
Przejście do / root nie jest dobrą radą w trybie produkcyjnym! Jest powód, dla którego folder publiczny istnieje
toesslab
Aby upewnić się, że reguły przepisywania działają, sprawdź, czy konfiguracja apache <Directory ...ma AllowOverride All'coś takiego: <Directory "/var/www/html/laravel/public"> Options Indexes FollowSymLinks MultiViews **AllowOverride All** </Directory>
Japheth Ongeri - inkalimeva
A jeśli nie mam dostępu do informacji o hostingu?
Peter
40

Wypróbowałem to na Laravel 4.2

Zmień nazwę server.phpw folderze głównym Laravel na index.phpi skopiuj .htaccessplik z /publickatalogu do folderu głównego Laravel.

Mam nadzieję, że to zadziała

Tejas Jadhav
źródło
1
Jeśli zaakceptowana odpowiedź Luazana nie zadziała, to wystarczy. Chociaż upewniłbym się, że edytuję plik index.php w folderze publicznym, aby przekierowywać użytkowników poza publiczne, jeśli przejdą bezpośrednio do tego łącza.
Brad Bird
4
Pliki js i css nie są już ładowane z folderu publicznego
llioor
@MaHDyfo - dlaczego nie jest bezpieczny? i jak ?
151291
2
@ 151291, ponieważ plik .env jest dostępny dla każdego, kto w ten sposób odwiedza Twoją witrynę. chyba że zabezpieczysz serwer WWW, aby tego uniknąć.
Mahdyfo
17

Nie daj się zmylić z inną opcją, której używam poniższy fragment kodu, który będzie przydatny również dla Ciebie. Umieść poniższe htacces w swoim katalogu głównym.

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

Przejdź do katalogu publicznego i umieść kolejny plik htaccess z poniższym fragmentem kodu

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

To działa... !!!

Laravel Używa poniżej .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]
Ankit Vishwakarma
źródło
Świetnie: czy możesz mi powiedzieć, jakie są wady i zalety tej metody?
Muhammad Ateek,
Edytowałem tylko plik .htaccess w katalogu głównym (Twój pierwszy fragment) i to naprawiło to dla mnie, dzięki!
peird
13

OTO PROSTE KROKI, ABY USUNĄĆ PUBLICZNE Z ADRESU URL (Laravel 5)

1: Skopiuj wszystkie pliki z folderu publicznego i wklej je do folderu głównego laravel

2: Otwórz index.php i zmień

Z

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

Do

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

I

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

Do

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

W laravel 4 ścieżka 2 jest $app = require_once __DIR__.'/bootstrap/start.php';zamiast$app = require_once __DIR__.'/bootstrap/app.php';/app.php

To jest to.

Khandad Niazi
źródło
Czy są jakieś inne komplikacje dotyczące innych linków z witryny?
Haring 10
To wygląda na świetne rozwiązanie, ale też proste. Ale tak naprawdę, jak powiedział Haring10. Czy są z tym jakieś problemy?
Peter
10

1) Sprawdź, czy mod_rewrite jest włączony. Przejdź do /etc/apache2/mods-enabledkatalogu i sprawdź, czy rewrite.loadjest dostępny. Jeśli nie, włącz go za pomocą polecenia sudo a2enmod rewrite.Włącza to moduł przepisywania. Jeśli jest już włączona, wyświetli komunikat Module rewrite already enabled.
2) Stwórz wirtualnego hosta dla katalogu publicznego tak, aby zamiast dawać http://localhost/public/index.phpbędziemy mogli z niego korzystać http://example.com/index.php. [stąd nazwa folderu publicznego zostanie ukryta]
3) Następnie utwórz plik .htaccess, który ukryje plik index.php przed adresem URL, który powinien znajdować się w katalogu głównym (folderze publicznym)

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?/$1 [L]
Orchidea
źródło
1
Próbowałem swoich kroków. Nie mam jeszcze wyniku! Nie wiem, dlaczego to się dzieje!
Mostafiz Rahman
Podaj informacje dziennika, abyśmy mogli prześledzić pierwotną przyczynę
Orchid
Oto pełny plik dziennika: dropbox.com/s/8fhlbej86nqr5qj/laravel.log?dl=0
Mostafiz Rahman
pracował dla mnie. Nie kieruj wirtualnego hosta bezpośrednio do folderu publicznego.
cardi777
Dziękuję Ci. To zadziałało dla mnie, mój mod_rewritebył wyłączony.
Maubeh,
5

To prawdopodobnie ma niewiele wspólnego z Laravelem, a wszystko, co ma związek z konfiguracjami Apache.

Czy masz dostęp do konfiguracji swojego serwera Apache? Jeśli tak, sprawdź to w dokumentacji:

Ogólnie rzecz biorąc, powinieneś używać plików .htaccess tylko wtedy, gdy nie masz dostępu do głównego pliku konfiguracyjnego serwera. Na przykład istnieje powszechne błędne przekonanie, że uwierzytelnianie użytkownika powinno zawsze odbywać się w plikach .htaccess, aw ostatnich latach pojawiło się inne błędne przekonanie, że dyrektywy mod_rewrite muszą znajdować się w plikach .htaccess. Po prostu tak nie jest. Możesz umieścić konfiguracje uwierzytelniania użytkownika w konfiguracji serwera głównego i jest to w rzeczywistości preferowany sposób robienia rzeczy. Podobnie, dyrektywy mod_rewrite działają lepiej pod wieloma względami w konfiguracji serwera głównego.

... Ogólnie rzecz biorąc, należy unikać używania plików .htaccess, jeśli jest to możliwe. Każda konfiguracja, którą rozważałbyś umieszczenie w pliku .htaccess, może być równie skutecznie wykonana w sekcji w pliku konfiguracyjnym głównego serwera.

Źródło: dokumentacja Apache .

Powodem, dla którego wspominam o tym jako pierwszy, jest to, że najlepiej jest się go .htaccesscałkowicie pozbyć, jeśli możesz, i użyć Directorytagu wewnątrz VirtualHosttagu. Biorąc to pod uwagę, reszta tego zakłada, że ​​z .htaccessjakiegokolwiek powodu trzymasz się trasy.

Aby to wyjaśnić, może się wydarzyć kilka rzeczy:

  1. Pragnę zauważyć, być może bezcelowo, że .htaccesw pytaniu wymieniono plik . Domyślam się, że jest to literówka, ale z drugiej strony jest szansa, że ​​ją przeoczyłeś, a tak naprawdę brakuje tylko sekund, to jest dokładnie taki drobny błąd, który sprawiłby, że walę głową w ścianę, szukając czegoś trudniejszego .

  2. Twój serwer nie mógł zezwolić .htaccess. Aby to sprawdzić, przejdź do pliku konfiguracyjnego Apache. W nowoczesnych kompilacjach Apache zwykle nie ma tego w jednym pliku konfiguracyjnym, więc upewnij się, że używasz tego, który wskazuje na twoją aplikację, gdziekolwiek ona istnieje. Zmiana

    AllowOverride none
    

    do

    AllowOverride all
    

    W ramach kontynuacji dokumenty Apache zalecają również, aby ze względów bezpieczeństwa nie robić tego dla każdego folderu, jeśli zamierzasz .htaccessprzepisać. Zamiast tego zrób to dla folderów, do których chcesz dodać .htaccess.

  3. Czy masz mod_rewritewłączone? To może powodować problemy. Zauważyłem, że masz metkę u góry <IfModule mod_rewrite.c>. Spróbuj wykomentować te tagi i zrestartuj Apache. Jeśli pojawi się błąd, to prawdopodobnie dlatego, że musisz włączyć mod_rewrite: Jak włączyć mod_rewrite dla Apache 2.2

Mam nadzieję że to pomoże. Wymieniłem niektóre z najczęstszych problemów, ale jest kilka innych, które mogą być bardziej przyziemne lub wyjątkowe. Kolejna sugestia dotycząca serwera deweloperskiego? Zainstaluj ponownie Apache. Jeśli to możliwe, zrób to z innego źródła z dobrym samouczkiem.

smcjones
źródło
Świetny chwyt dla ustawień konfiguracyjnych apache2, za każdym razem tęsknię za tym ustawieniem.
Abhishek
4

Dla Laravel 4 i 5:

  1. Zmień nazwę server.phpw folderze głównym Laravel naindex.php
  2. Skopiuj .htaccessplik z /publickatalogu do głównego folderu Laravel .

Otóż ​​to !! :)

Abhijeet Navgire
źródło
2

Upewnij się także, że Rewrite Engline jest włączony po edycji pliku .htaccess

sudo a2enmod rewrite
Rafik Bari
źródło
Dobra obserwacja byłem na nowym serwerze i faktycznie miał ją włączyć (i dodać odpowiednie bity w konfiguracji apache, jak również) przy użyciu tego digitalocean.com/community/tutorials/...
cdsaenz
1

Laravel jest już dostarczany z ładnym adresem URL .htaccess ... powinieneś być dobry, aby wyjść z pudełka ... http://laravel.com/docs/installation#pretty-urls

Upewnij się, że mod_rewrite jest włączony, a ścieżka domowa jest ustawiona na katalog publiczny aplikacji.

Kisuka
źródło
Aktywowałem mod_rewritei skopiowałem kod, który jest na tej stronie i nadal nie działa
TuGordoBello
1
Upewnij się, że w Apache Twoja ścieżka jest ustawiona na folder publiczny aplikacji.
Kisuka
ServerAdmin webmaster@localhost DocumentRoot /home/web-apps/myproject/public
TuGordoBello
Czy zrestartowałeś Apache po włączeniu mod_rewrite?
Kisuka
Mam folder o nazwie userto miejsce gdzie trzymam zdjęcia, również mam plik blaszka o nazwie user, kiedy piszę w adresie URL myproject.com/userpokazuje mi zawartość folderu, zdjęcia
TuGordoBello
1

Aby to zrobić, musisz wykonać następujące kroki, które są następujące

  • Zmapuj swoją domenę do folderu publicznego projektu (tj. / Var / www / html / yourproject / public) (jeśli używasz Linuksa)

  • Przejdź do swojego publicznego folderu, edytuj .htaccesstam swój plik

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>


  • Ostatnie trzy zasady dotyczą bezpośredniego dostępu do dowolnej trasy bez httpsniej.
Shahrukh Anwar
źródło
0
 RewriteEngine on

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

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

użyj tego w .htaccess i zrestartuj serwer

Bieg
źródło
0

Mam nadzieję, że to pomaga, tak jak w przypadku mnie.

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_URI} !^public
RewriteRule ^(.*)$ public/$1 [L]
</IfModule>
Harry Bosh
źródło
0

Właśnie zainstalowałem Laravel 5 dla projektu iw katalogu głównym znajduje się plik o nazwie server.php.

Zmień to na index.phpi działa lub wpisz terminal:

$cp server.php index.php
Samuel Kwame Antwi
źródło
0

Zmień nazwę server.phpw folderze głównym Laravel na index.phpi skopiuj .htaccessplik z /publickatalogu do folderu głównego Laravel.

Rizwan Taj
źródło
0

Jeśli używasz IIS Windows Server, dodaj web.configplik do folderu głównego i umieść poniższy kod:

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

a jeśli .htaccess używasz tego:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
Abd Abughazaleh
źródło
-3
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(.*)/(public)/(index.php)/$ $1/$4 [L]
</IfModule>
onlinewebsite
źródło
3
Dostarcza więcej wyjaśnień do twojego rozwiązania
Naruto
-3

Zgodnie z Laravel 5.3 powyższe rzeczy nie będą działać poprawnie, ale proszę o spokój i wykonaj poniższe czynności:

Krok 1. Przejdź do wnętrza projektu laravel
Krok 2. Utwórz jeden losowy katalog / folder np. laravelcode
Krok 3. Przenieś wszystkie foldery i pliki (z wyjątkiem folderu publicznego )
Krok 4. Przenieś wszystkie foldery i pliki znajdujące się w folderze publicznym do projektu laravel
Krok 5. Teraz w projekcie laravel znajduje się plik index.php, proszę otwórz to i zmień ścieżki folderów dla ładowania początkowego zgodnie z nową ścieżką, tak jak poprzednio " Wymagaj DIR . '/ .. / bootstrap / autoload.php';" teraz będzie "wymagało DIR . '/ laravelcode / bootstrap / autoload.php';"

To wszystko, po prostu uruchom swój adres URL bez public i index.php, jak poniżej http: // localhost / blog /

amar nath jena
źródło