Laravel 5 - Usuń publiczny z adresu URL

241

Wiem, że jest to bardzo popularne pytanie, ale nie udało mi się znaleźć działającego rozwiązania dla Laravela 5. Od dłuższego czasu próbowałem przeprowadzić migrację z Codeigniter, ale ten skomplikowany proces instalacji mnie zniechęca.

Nie chcę uruchamiać maszyny wirtualnej, wydaje się to po prostu niewygodne podczas przełączania między projektami.

Nie chcę ustawiać katalogu głównego dokumentu na folder publiczny, jest to również niewygodne przy przełączaniu między projektami.

Wypróbowałem metodę mod_rewrite .htaccess

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

To po prostu daje mi wyjątek Laravel NotFoundHttpException w linii compiled.php 7610.

Kiedy próbowałem L4 jakiś czas temu, użyłem metody przeniesienia zawartości folderu publicznego do katalogu głównego. Struktura L5 jest zupełnie inna i wykonanie tych samych kroków całkowicie złamało Laravela (serwer zwróciłby tylko pustą stronę).

Czy istnieje przyzwoita metoda usuwania „publicznych” w środowisku programistycznym, która:

  1. Działa z L5
  2. Pozwala mi z łatwością przełączać się między projektami (zwykle pracuję nad 2 lub 3 jednocześnie).

Dzięki

** Używam MAMP i PHP 5.6.2

użytkownik1537360
źródło
1
Struktura folderów w przewodniku jest inna niż moja, wyobrażam sobie, że nie używa L5? Pominąłem zmiany, które wprowadził w pliku Bootstrap / Paths, ponieważ on nie istnieje. Wygląda jednak na to, że projekt działa. Myślisz, że to jest w porządku?
user1537360
mój błąd pozwól mi dodać odpowiedź dla L5
kamlesh.bar
bez sukcesu próbując tego samego
kamlesh.bar
1
Wydaje się, że działa po prostu modyfikując ścieżki w pliku index.php, ale jestem nowy w Laravel, więc oczywiście nie mogę komentować, czy jest to stabilne / bezpieczne.
user1537360,
Pozostałe foldery / pliki powinny znajdować się pod katalogiem głównym dokumentu.
Mike Rockétt,

Odpowiedzi:

431

W przypadku Laravel 5:

  1. Przemianować server.php w folderze głównym Laravel naindex.php
  2. Skopiuj .htaccessplik z /publickatalogu do folderu głównego Laravel.

Otóż ​​to!

Asfaq Tamim
źródło
105
co to może być niebezpieczne, upewnij się, że nikt nie może poprosić o Twój .envplik, jeśli to robisz, chyba że jesteś w porządku z osobami przeglądającymi hasło do bazy danych jawnym tekstem;)
GabLeRoux
48
Nie działałoby to, jeśli odwołujesz się do swoich zasobów przy użyciu ścieżki względnej z katalogu głównego, tj. „/assets/styles.css” i tak dalej. Nadal mam problemy ze znalezieniem najlepszego sposobu wdrożenia go na serwerach
Ghazanfar Mir
1
Działa to ... Ale czy korzystanie z tego ma jakieś konsekwencje / wady? Wielu sugeruje skonfigurowanie wirtualnego hosta lub ręczne kopiowanie plików itp. Czy to działa również w środowisku produkcyjnym?
Bogz
1
@GabLeRoux <Files "log.txt">Order Allow,DenyDeny from all</Files>rozwiązuje problem, który rozwiązałeś. Czy teraz jest to bezpieczne, czy może istnieje ryzyko?
Motyl
1
@ Butterflyit zależy od konfiguracji serwera. Powyższe będzie tylko blokować log.txt. Tylko upewnij się, że blokujesz poufne dane od społeczeństwa. Jeśli użyjesz Laravela i dokładnie zapoznasz się z dokumentacją , będzie wyglądał twój webroot project/public. Zajrzyj do tej qa dyskusji o przepływie stosów . Skonfiguruj swój serwer internetowy i spróbuj na https://example.com/.envwszelki wypadek. Jeśli zobaczysz swoje hasła, zastanów się, czy wszystko zostało naruszone i zmień wszystkie hasła.
GabLeRoux,
126

Rozwiązałem problem, używając 2 odpowiedzi:

  1. Zmiana nazwy server.php na index.php (bez modyfikacji)
  2. Skopiuj .htaccess z folderu publicznego do folderu głównego (jak rimon.ekjon powiedział poniżej)
  3. Zmiana .htaccess to trochę w następujący sposób dla statyki:

    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]

    Jeśli są jakieś inne pliki statyczne , po prostu dodaj rozszerzenie do poprzednio zadeklarowanej listy

ka_lin
źródło
1
cześć @KA_lin. Jak uniemożliwić komuś przeglądanie .env, jak na przykład localhost / oap / .env
Fokwa Best
8
Hmmm ... spróbujRewriteRule ^.env - [F,L,NC]
ka_lin
2
Lub <Files ~ "\.env$"> Order allow,deny Deny from all </Files>
ka_lin
Dziękuję bardzo @ka_lin, czy jest jakiś sposób na usunięcie dostępu przez / public /? tak jak działa www.yoursite.com, ale działa również www.yoursite.com/public, czy można usunąć ostatni?
adaba
8
Działa, ale css, js i obrazy nie ładują się
Chetan Khandla
94

W Laravel 5.5 utwórz plik .htacess w swoim katalogu głównym i umieść następujący kod: - Link referencyjny

<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>
Raham
źródło
5
najlepsza odpowiedź! jedyny, który działał w moim przykładzie, powinien mieć zdecydowanie więcej głosów
FiliusBonacci
Dzięki, to dla mnie praca. Ale chcę wiedzieć, że ma jakiś problem z bezpieczeństwem, czy nie.
rahul singh Chauhan
@rahulsinghChauhan moja przyjemność. Drogi, nie wiem co do kwestii bezpieczeństwa, ale powinna być bezpieczna.
Raham
2
Co robi ta zasada RewriteRule ^ ^$1 [N]?
gonzo
To jedyne, które dla mnie zadziałało ... bardzo dziękuję
Arshad Ameen
86

NIE!

NAPRAWDĘ NIE NALEŻY zmieniać nazwy server.phpfolderu głównego Laravel index.php i kopiować .htaccessgo z /publickatalogu do folderu głównego Laravel !!!

W ten sposób każdy może uzyskać dostęp do niektórych plików ( .envna przykład). Spróbuj sam. Nie chcesz tego!


ROBIĆ

Zamiast tego powinieneś utworzyć .htaccessplik w swoim katalogu głównym w następujący sposób:

RewriteEngine On
RewriteCond %{REQUEST_URI} !^/public/
RewriteRule ^(.*)$ /public/$1 [L,QSA]

Spowoduje to dyskretne przepisanie wszystkich podstawowych identyfikatorów URI do /publicfolderu. Nawet wszystkie nagłówki , na przykład nagłówek autoryzacji HTTP i wszystkie opcjonalne parametry identyfikatora URI zostaną po cichu przekazane również do /publicfolderu.

To wszystko

Podczas konfigurowania projektu Laravel za pomocą Dockera pamiętaj: nie musisz tego robić.

Derk Jan Speelman
źródło
2
Działa dobrze w produkcji, ale nie działa lokalnie, jakaś sugestia?
Haritsinh Gohil
2
To doskonale działa! lokalne i serwerowe podziękowania za pomoc w zakresie bezpieczeństwa!
Ghanshyam Nakiya,
1
Witaj, @DerkJanSpeelman Próbuję przesłać moje pliki laravel do podfolderu na moim hostingu, np .: (example.com/projects/laravel/blog). W takim przypadku odwiedzający muszą odwiedzić przykład.com/projects/laravel/blog/ public, dlatego umieszczam plik .htaccess z Twoim kodem w katalogu głównym folderu blogu i chcę, aby przekierował do folderu publicznego. Ale to nie działa. Występuje błąd: Żądany adres URL / public / nie został znaleziony na tym serwerze. Jak mogę to rozwiązać?
Shovon Das,
1
Ta odpowiedź jest niedoceniana. Wybrany za Pogrubiony i wyróżniony Nie. Działa absolutnie dobrze.
Varun Ved
2
Idealna odpowiedź
alnassre,
43

Łatwy sposób na usunięcie publicznych z adresu laravel 5. Wystarczy wyciąć plik index.php i .htaccess z katalogu publicznego i wkleić go do katalogu głównego, to wszystko i zastąpić dwie linie w pliku index.php jako

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

Uwaga : powyższa metoda jest przeznaczona tylko dla początkujących, ponieważ mogą mieć problem z konfiguracją wirtualnego hosta. Najlepszym rozwiązaniem jest skonfigurowanie wirtualnego hosta na lokalnej maszynie i skierowanie go do katalogu publicznego projektu.

Muhammad Sadiq
źródło
1
Po tym, jak css nie ładuje się, bcoz wszystkie css są publiczne, a publiczność jest usuwana z adresu URL
pan Tomar
1
Podczas ładowania możesz umieścić „public /” przed plikami js lub css, np. Html :: script („public / js / .....”); - Ale najlepszym rozwiązaniem byłby wirtualny host ...
Muhammad Sadiq
39

@ rimon.ekjon powiedział:

Zmień nazwę server.php w folderze głównym Laravel na index.php i skopiuj plik .htaccess z katalogu / public do folderu głównego Laravel. -- Otóż to !! :)

To działa dla mnie. Ale wszystkie pliki zasobów w katalogu / public nie mogły znaleźć i adresy URL żądań nie działały, ponieważ użyłem pomocnika asset ().

Zmieniłem funkcję /Illuminate/Foundation/helpers.php/asset () w następujący sposób:

function asset($path, $secure = null)
{
    return app('url')->asset("public/".$path, $secure);
}

Teraz wszystko działa :)

Dziękuję @ rimon.ekjon i wam wszystkim.

Miron
źródło
3
To nie jest dobry sposób na rozwiązanie tego problemu, ponieważ próbujesz dokonać aktualizacji w katalogu dostawców, co nie jest dobrą praktyką.
Shadman
1
wystarczy tylko dodać RewriteRule ^(.*)$ public/$1 [L]plik .htaccess, który skopiowałeś z katalogu publicznego, usuwając ten wierszRewriteRule ^(.*)/$ /$1 [L,R=301]
Shadman
29

Po prostu utwórz plik .htaccess w katalogu głównym i dodaj do niego te linie

<IfModule mod_rewrite.c>
    RewriteEngine On

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

Otóż ​​to!

Powyższy kod działa w głównym folderze public_html. Powiedziawszy, że twój podstawowy plik laravel powinien znajdować się w folderze public_html, jeśli twój katalog wygląda jak public_html / laravelapp / public i jeśli umieścisz powyższy kod w laravelapp, to nie będzie działać. Dlatego musisz skopiować wszystkie swoje podstawowe pliki do public_html i tam umieścić plik .htaccess.

Jeśli chcesz zachować kod w podkatalogu, możesz utworzyć subdomenę, ten kod również będzie działał.

Abhinav Saraswat
źródło
Odpowiedziałem poniżej, zanim przeczytałem twoją odpowiedź i musi to być odpowiedź zaakceptowana. Brak zmian w plikach: tylko prosta, sprytna reguła.
Brigo,
@Raham jaki jest twój aktualny adres URL?
Abhinav Saraswat
2
Chcę tylko dodać krótki opis do pracy tego dżentelmena. Powyższy kod działa w głównym folderze public_html (również miałem problemy). Powiedziawszy, że twój podstawowy plik laravel powinien znajdować się w folderze public_html, popełniłem błąd, że mój katalog wyglądał jak public_html / laravelapp / public, jeśli umieścisz powyższy kod w laravelapp, to nie zadziała. Dlatego musisz skopiować wszystkie swoje podstawowe pliki do public_html i tam umieścić plik .htaccess. Odwoływanie się do hostingu centOS i Cpanel dla laravel.
Deepesh Thapa,
Jakie są wady stosowania tej metody?
Script47,
1
Dla mnie zadziałało, miałem tylko webshost cPanel i nie mogłem zmienić RootDirectory dla Apache. Dzięki ! najprostszy i najbezpieczniejszy. To nie pozwoli zobaczyć zawartości twojego folderu głównego
Vincent Decaux,
27

Utwórz .htaccessplik w katalogu głównym i umieść kod podobny do poniższego.

<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>
Pallav Nagar
źródło
1
Naprawdę polecam to rozwiązanie.
TheLastCodeBender
1
Polecam również to rozwiązanie
iglesiasedd
Dziękuję bardzo. To jest idealne (y)
Prappo Islam Prince
3
działa dobrze, ale plik .env jest dostępny bezpośrednio z adresu URL.
Manoj Singh,
czy to bezpieczne rozwiązanie?
Starszy zespół programistów PHP
23

1) Nie znalazłem działającej metody przenoszenia katalogu publicznego w L5 . Podczas gdy możesz modyfikować niektóre rzeczy w bootstrapindex.php , wydaje się, że kilka funkcji pomocniczych opiera się na założeniu, że jest tam katalog publiczny. Szczerze mówiąc, naprawdę nie powinieneś przenosić katalogu publicznego.

2) Jeśli korzystasz z MAMP , powinieneś tworzyć nowe vhosty dla każdego projektu, każdy obsługujący ten katalog publiczny. Po utworzeniu uzyskujesz dostęp do każdego projektu przez zdefiniowaną nazwę serwera w następujący sposób:

http://project1.dev
http://project2.dev
Jeremy Schaffer
źródło
15

Możliwe jest usunięcie publiczne adresu URL w laravel5. Wykonaj następujące kroki:

krok 1. skopiuj cały plik z publicznego i wklej do katalogu głównego

krok 2. otwórz index.phpplik zamień na

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

I usuń całą pamięć podręczną i pliki cookie.

piyush patel
źródło
Cześć, wypróbowałem twoją metodę, wykonałem powyższe kroki, ale pokazuje ona następujące błędy: Ostrzeżenie: wymagany_once (D: \ Projekty \ laravel / public / index.php): nie udało się otworzyć strumienia: Brak takiego pliku lub katalogu w D: \ Projekty \ laravel \ server.php w linii 21 Błąd krytyczny: wymagany_once (): Wymagane niepowodzenie otwarcia 'D: \ Projekty \ laravel / public / index.php' (ścieżka_włączenia = '.; C: \ xampp \ php \ PEAR' ) w D: \ Projekty \ laravel \ server.php w linii 21
Ali Shahzad
To nie jest idealna odpowiedź, raczej jest to bardzo niepewny sposób.
Rohit,
11

Załóżmy, że umieściłeś wszystkie pozostałe pliki i katalogi w folderze o nazwie „locale”.

wprowadź opis zdjęcia tutaj

Po prostu przejdź do index.php i znajdź te dwie linie:

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

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

i zmień je na:

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

$app = require_once __DIR__.'/locale/bootstrap/app.php';
Angelo Joseph Salvador
źródło
11

Oto najlepsze i najkrótsze rozwiązanie, które działa dla mnie od maja, 2018 dla Laravel 5.5

  1. po prostu wytnij .htaccessplik z katalogu / public do katalogu głównego i zastąp go zawartością następującym kodem:

    <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. Po prostu zapisz .htaccessplik i to wszystko.

  3. Zmień nazwę server.phppliku na index.php. to wszystko cieszy!

Tony Pro
źródło
9

Najlepszym rozwiązaniem: Nie polecam usuwania opinii publicznej, zamiast on local computer create a virtual host point to public directoryi on remote hosting change public to public_html and point your domain to this directory. Powód, cały twój kod laravel będzie bezpieczny, ponieważ jest o jeden poziom niższy od twojego katalogu publicznego :)

METODA 1:

Po prostu zmieniam nazwę server.phpna index.phpi to działa

METODA 2:

Działa to dobrze dla wszystkich wersji laravel ...

Oto moja struktura katalogów,

/laravel/
... app
... bootstrap
... public
... etc

Wykonaj te proste kroki

  1. przenieś wszystkie pliki z katalogu publicznego do root / laravel /
  2. teraz nie ma potrzeby publicznego katalogu, więc opcjonalnie możesz go teraz usunąć
  3. teraz otwórz plik index.php i dokonaj następujących zamian

wymagają DIR . '/ .. / bootstrap / autoload.php';

do

wymagają DIR . '/ bootstrap / autoload.php';

i

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

do

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

  1. teraz otwórz bootstrap / paths.php i zmień ścieżkę katalogu publicznego:

„public” => DIR . ”/ .. / public”,

do

„public” => DIR . ”/ ..”,

i to wszystko, teraz spróbuj http: // localhost / laravel /

Wasim A.
źródło
Wszystko w porządku. ale polecenie rzemieślnika nie działa, po prostu pokazuje „Nie można otworzyć pliku wejściowego: rzemieślnik”. Czy jest jakaś sugestia?
Kabir Hossain
Ta metoda zadziałała, jeśli możesz udostępnić poświadczenia swojej bazy danych użytkownikom. localhost / laravel / .env
MasoodUrRehman
8

4 najlepsze sposoby na usunięcie publicznych z adresu URL.

Jeśli użyłeś innej sztuczki, aby usunąć publiczność z adresu URL, np. Zmień nazwę server.php na index.php i zmień ścieżkę do pliku podstawowego. Oczywiście nie rób tego. To dlaczego Laravel nie podaje takiego rozwiązania, ponieważ nie jest to właściwy sposób na zrobienie tego.

1) Usuń publiczny z adresu URL za pomocą htaccess w Laravel

Dodając plik .htaccess do katalogu głównego, możesz uzyskać dostęp do strony internetowej bez publicznego

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

2) Usuń publiczną, tworząc wirtualny host w swoim lokalnym

Daję tutaj wersję demonstracyjną systemu operacyjnego Windows. Spróbuję jednak zdefiniować krok, aby każdy mógł łatwo go wykonać. Możesz także poszukać w google tego samego dla konkretnego systemu operacyjnego.

Krok 1: Przejdź do C: \ Windows \ system32 \ drivers \ etc \ otwórz plik „hosts” w trybie administratora.

Krok 2: Dodaj do niego następujący kod. Tutaj daję ci demo projektu nazwa domeny. Lokalna demonstracja nazwy domeny, możesz określić dowolne, jak chcesz. Po prostu zrób to w każdym miejscu.

127.0.0.1  projectname.local

Krok 3: Teraz przejdź do, C:\xampp\apache\conf\extradla użytkowników Xampp i dla użytkownika Wamp "C:\wamp\bin\apache\Apache2.4.4\conf\extra"i otwórz "httpd-vhosts.conf"plik. Teraz dodaj do niego następujący kod.

Uwagi: Zmień katalog główny dokumentu zgodnie z projektem, a także dodaj nazwę domeny, jak zdefiniujesz, do pliku „hosts”.

<VirtualHost projectname.local>
      ServerAdmin projectname.local
      DocumentRoot "C:/xampp/htdocs/projectdir"
      ServerName projectname.local
      ErrorLog "logs/projectname.local.log"
      CustomLog "logs/projectname.local.log" common
 </VirtualHost>

Krok 4: Ostatnim, ale ważnym krokiem jest zrestartowanie Xamppa lub Wampa i dostęp do http://projectname.localadresu URL jak, a Laravel odpowie bez publicznego adresu URL.


3) Usuń publiczność, uruchamiając polecenie w Laravel

Jeśli pracujesz w trybie lokalnym, nie musisz nic robić, wystarczy uruchomić następujące polecenie z poziomu terminala lub narzędzia wiersza poleceń. Następnie możesz uzyskać dostęp do swojej witryny, podając adres URL z wiersza polecenia.

   > php artisan serve

Jeśli chcesz uruchomić projekt w określonym adresie IP, musisz uruchomić następujące polecenie. Jeśli pracujesz w sieci LAN, jeśli chcesz zezwolić innym osobom na dostęp do Twojej witryny z lokalnego, musisz po prostu sprawdzić swój adres IP za pomocą wiersza polecenia, uruchamiając polecenie „ipconfig” po uruchomieniu adresu IP po wykonaniu polecenia.

> php artisan serve --host=192.168.0.177

Jeśli chcesz uruchomić projekt na określonym adresie IP z określonym portem, musisz wykonać następujące polecenie.

> php artisan serve --host=192.168.0.177 --port=77

4) Usuń publiczną na serwerze hostowanym lub w panelu

wprowadź opis zdjęcia tutaj

Po zakończeniu projektu musisz hostować projekt na serwerze, a następnie wystarczy ustawić katalog główny dokumentu w domenie na folder publiczny. Sprawdź poniższy zrzut ekranu.

Zgodnie ze zrzutem ekranu, jeśli nie masz żadnego folderu projektu w public_html, wystarczy ustawić katalog główny dokumentu jak "public_html/public".

Referencje zaczerpnięte stąd

Mayank Dudakiya
źródło
1
Wszystkie cztery sposoby są dobre, ale rozwiązałem problem, używając pierwszego rozwiązania.
Manisha
7

Chciałbym dodać do @Humble Learner i zauważyć, że poprawną lokalizacją do „naprawy” ścieżki URL dla zasobów jest /Illuminate/Routing/UrlGenerator.php/asset ().

Zaktualizuj metodę, aby pasowała:

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, '/');
}

To naprawi skrypty, style i ścieżki obrazu. Wszystko dla ścieżek zasobów.

Sean Perkins
źródło
6

Aby użytkownik XAMPP mógł usunąć adres publiczny z adresu URL bez dotykania domyślnego systemu plików laravel, należy ustawić wirtualny host dla aplikacji, aby to zrobić, wykonaj następujące kroki

  1. Otwórz aplikację panelu sterowania XAMPP i zatrzymaj Apache. Pamiętaj, że późne komputery z systemem Windows mogą uruchamiać go jako usługę, więc zaznacz pole po lewej stronie modułu Apache.

  2. Przejdź do C:/xampp/apache/conf/extralub gdziekolwiek się znajdują twoje pliki XAMPP.

  3. Otwórz plik o nazwie httpd-vhosts.conf w edytorze tekstu.

  4. Wokół linii 19 znajdź # NameVirtualHost *:80i usuń komentarz lub usuń skrót.

  5. Na samym dole pliku wklej następujący kod:

<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. Teraz możesz skopiować i wkleić powyższy kod, aby dodać katalogi hosta wirtualnego. Na przykład pracuję nad witryną o nazwie Eatery Engine, więc następujący fragment pozwoli mi na pracę z subdomenami w mojej instalacji lokalnej:
<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. Następnie przejdź do pliku hosta systemu Windows, aby edytować hosty. plik będzie się znajdować naC:/Windows/System32/drivers/etc/hosts , gdzie host jest plikiem. Otwórz za pomocą notatnika.
  2. Sprawdź, czy rozpoznawanie nazw #localhost jest obsługiwane w samym DNS.

127.0.0.1 localhost

Rozpoznawanie nazw localhost jest obsługiwane w samym DNS.

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. Uruchom ponownie Apache i przetestuj wszystko.

Oryginalny artykuł można znaleźć tutaj

słoneczny kashyap
źródło
5

Zawsze jest powód, aby mieć folder publiczny w konfiguracji Laravel, wszystkie powiązane z nim rzeczy powinny znajdować się w folderze publicznym,

Nie kieruj adresu IP / domeny do folderu głównego Laravel, ale wskaż folder publiczny. Nie jest bezpieczne wskazywanie IP serwera na folder główny. Ponieważ bez wpisania ograniczeń .htaccessmożna łatwo uzyskać dostęp do innych plików.,

Po prostu napisz warunek przepisania do .htaccesspliku i zainstaluj moduł przepisywania i włącz moduł przepisywania, problem dodawania publicznych do trasy zostanie rozwiązany.

Reiah Paul Sam
źródło
3

Wiem, że istnieje wiele rozwiązań tego problemu. Najlepszym i najłatwiejszym rozwiązaniem jest dodanie pliku .htaccess do katalogu głównego .

Próbowałem odpowiedzi, które podaliśmy dla tego problemu, ale napotkałem pewne problemy z auth: api guard w Laravel.

Oto zaktualizowane rozwiązanie:

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

    RewriteEngine On
    RewriteCond %{HTTP:Authorization} ^(.*)
    RewriteRule .* - [e=HTTP_AUTHORIZATION:%1]

    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>

Utwórz plik .htaccess w katalogu głównym i dodaj ten kod. I wszystko idzie dobrze

CHARITRA SHRESTHA
źródło
2

Laravel 5.5

Po zainstalowaniu Laravela po raz pierwszy napotkałem znany problem „folderu publicznego” i wymyśliłem to rozwiązanie, które moim zdaniem jest „czystsze” niż inne, które znalazłem w sieci.


Osiągnięcia

  • Nie mam public słowa w URI
  • Chroń .envplik przed ciekawskimi ludźmi

Wszystko można zrobić, edytując .htaccessużycie mod_rewritei cztery proste reguły.


Kroki

  1. Przenieś .htaccessplik dopublic/.htaccess do głównego katalogu głównego
  2. Edytuj go jak poniżej

Skomentowałem wszystko, więc powinno być jasne (mam nadzieję) także dla tych, którzy nigdy nie korzystali mod_rewrite(wręcz przeciwnie, nie jestem ekspertem). Aby zrozumieć zasady, musi być jasne, że w Laravel, jeśli Bill się łączy https://example.com, https://example.com/index.phpjest załadowany. Ten plik zawiera tylko polecenie header("refresh: 5; https://example.com/public/"), które wysyła żądanie do https://example.com/public/index.php. Ta sekunda index.phpodpowiada za załadowanie kontrolera i innych rzeczy.

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

Następującą regułę (pierwotnie w public/.htaccess) można usunąć. Ta sama zasada została wyjaśniona bardziej szczegółowo w dwóch ostatnich regułach.

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

EDIT: Tęskniłem Abhinav Saraswat rozwiązanie „s , a jego odpowiedź powinna być przyjętym jeden. Tylko jedna, prosta i jasna reguła, która przekierowuje cały ruch do folderu publicznego bez modyfikowania żadnego pliku.

Brigo
źródło
2

Po pierwsze możesz skorzystać z tych kroków

W przypadku Laravel 5:

1. Zmień nazwę server.php w folderze głównym Laravel na index.php

2. Skopiuj plik .htaccess z katalogu / public do folderu głównego Laravel.

źródło: https://stackoverflow.com/a/28735930

po wykonaniu tych kroków musisz zmienić wszystkie ścieżki css i skryptów, ale będzie to męczące.

Propozycja rozwiązania : wystarczy dokonać niewielkiej zmiany helpers::assetfunkcji.

W tym celu :

  1. otwarty vendor\laravel\framework\src\Illuminate\Foundation\helpers.php

  2. mam linię 130

  3. pisz "public/".$pathzamiast $path,

    function asset($path, $secure = null){
       return app('url')->asset("public/".$path, $secure);
    }
Ferhat KOÇER
źródło
2
Zasada numer 1: Nigdy nie edytuj pliku podstawowego. Nawet jeśli teraz wygląda to łatwo i przyjemnie, zapłacisz później.
Janaka Dombawela
@JanakaDombawela nie sądzę, że w ten sposób, ponieważ:
Ferhat KOÇER,
@JanakaDombawela Nie sądzę, aby tak było, ponieważ: Senerio 1: jeśli programista ma doświadczenie: otwarty kod źródłowy jest przeznaczony do tego zadania Senerio 2: jeśli programista jest młodszy, programista musi edytować kod źródłowy, aby uzyskać doświadczenie
Ferhat KOÇER
2
<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews -Indexes
    </IfModule>

    RewriteEngine On

    # Handle Authorization Header
    RewriteRule ^(.*)$ public/$1 [L]
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

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

Aktywuj moduł mod_rewrite za pomocą

sudo a2enmod rewrite

i uruchom ponownie apache

sudo service apache2 restart

Aby użyć mod_rewrite z plików .htaccess (co jest bardzo częstym przypadkiem użycia), edytuj domyślny VirtualHost za pomocą

sudo nano /etc/apache2/sites-available/000-default.conf

Pod „DocumentRoot / var / www / html” dodaj następujące wiersze:

<Directory "/var/www/html">
AllowOverride All
</Directory>

Uruchom ponownie serwer:

sudo service apache2 restart
mujuonly
źródło
1

Przeczytałem już jakiś artykuł i działa dobrze, ale naprawdę nie wiem, czy jest bezpieczny, czy nie

    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. 

Edytuj plik index.php

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

do

require __DIR__.'/local/bootstrap/autoload.php';
$app = require_once __DIR__.'/local/bootstrap/app.php';
Yousef Altaf
źródło
1

Nawet jeśli nie zalecam umieszczania Laravela w folderze głównym, są przypadki, których nie da się uniknąć; dla tych przypadków powyższe metody nie działają dla zasobów, więc zrobiłem szybką poprawkę zmieniając htaccess: po skopiowaniu server.php do index.php edytuj plik .htaccess w następujący sposób:

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

To była szybka poprawka, którą musiałem wprowadzić, aby każdy mógł ją uaktualnić.

Płokko
źródło
1

Problemem jest, jeśli wpiszesz / public i nadal będzie dostępny w adresie URL, dlatego stworzyłem poprawkę, która powinna zostać umieszczona w public / index.php

  $uri = urldecode(
     parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH)
  );

  if(stristr($uri, '/public/') == TRUE) {

    if(file_exists(__DIR__.'/public'.$uri)){

    }else{

      $actual_link = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}";
      $actual_link = str_replace('public/', '',$actual_link);
      header("HTTP/1.0 404 Not Found");
      header("Location: ".$actual_link."");
      exit();
      return false;
   }}

ten spokój kodu usunie publiczność z adresu URL i da 404, a następnie przekieruje do adresu bez publicznego

Paul De Zwaan
źródło
0

Inną metodą, której używam, jest utworzenie dowiązania symbolicznego (w Linuksie, nie wiem o Win) za pomocą polecenia ln w htdocs lub www, tj ln projectname/public project . Strona jest więc dostępna przez localhost / project

Eli Makumba
źródło
0

Możesz usunąć publiczne słowo kluczowe z adresu URL za pomocą różnych metod.

1) Jeśli korzystasz z hostingu dedykowanego i masz dostęp do konta root, możesz usunąć publiczne słowo kluczowe z adresu URL za pomocą wirtualnego hosta. Powinieneś podać ścieżkę DocumentRoot publicznie. Spowoduje to uruchomienie indeksu z katalogu publicznego i usunięcie go z adresu URL.

<VirtualHost *:80>
    ServerAdmin [email protected]
    ServerName example.com
    ServerAlias www.example.com
    DocumentRoot /var/www/html/{yoursourcedirectory}/public

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

2) Jeśli nie masz dostępu do roota swojego hostingu, powinieneś wygenerować nowy plik .htaccess w swoim katalogu głównym i umieścić kod jak poniżej

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

Możesz uzyskać więcej informacji tutaj.

Vinod Joshi
źródło
0

Utwórz plik .htaccess w katalogu głównym i umieść kod podobny do poniższego.

<IfModule mod_rewrite.c>
 #Session timeout

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

Utwórz plik .htaccess w katalogu / public i umieść kod podobny do poniższego.

<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 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]
</IfModule>
Ghanshyam Nakiya
źródło
-1

Znalazłem najbardziej działające rozwiązanie tego problemu.

Po prostu edytuj swój .htaccessw folderze głównym i napisz następujący kod. Nic więcej nie jest wymagane

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

<IfModule php7_module>
   php_flag display_errors Off
   php_value max_execution_time 30
   php_value max_input_time 60
   php_value max_input_vars 1000
   php_value memory_limit -1
   php_value post_max_size 8M
   php_value session.gc_maxlifetime 1440
   php_value session.save_path "/var/cpanel/php/sessions/ea-php71"
   php_value upload_max_filesize 2M
   php_flag zlib.output_compression Off
</IfModule>
AKHIL RAJ
źródło
-1

wypróbowałem tutaj jakieś rozwiązanie i znalazłem htaccess, który działa dla laravel 5.2, w ten sposób:

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

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^/public/
RewriteRule ^(css|js|images)/(.*)$ public/$1/$2 [L,NC]
RewriteRule ^.env - [F,L,NC]
RewriteRule ^app - [F,L,NC]
RewriteRule ^bootstrap - [F,L,NC]
RewriteRule ^config - [F,L,NC]
RewriteRule ^database - [F,L,NC]
RewriteRule ^resources - [F,L,NC]
RewriteRule ^vendor - [F,L,NC]

gdy masz inny plik lub folder do zabronienia, po prostu dodaj

RewriteRule ^your_file - [F,L,NC]
Adam
źródło
-1

Nie musisz wiele robić, po prostu utwórz plik .htaccess w katalogu głównym i wklej / zapisz poniżej;

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(.*)$ public/$1 [L]
</IfModule>
Victor Ifeanyi Ejiogu
źródło
To przekierowuje mnie do / public / public
zanderwar
@zanderwar, proszę, jaka jest wersja Laravel? Mam również nadzieję, że nie masz projektu w podkatalogu z katalogu głównego?
Victor Ifeanyi Ejiogu
Projekt jest rootem, wersja to 5.6. * - Jest jednak w subdomenie, na współdzielonym hostingu; niestety ta instalacja cPanel zmusza subdomeny do posiadania folderu w public_html
zanderwar