Laravel 5-Usuń publiczny z adresu URL

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

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

Nie chcę ustawiać katalogu głównego dokumentu na folderze publicznym, jest to również niezręczne podczas przełączania między projektami.

Próbowałem .metoda htaccess mod_rewrite

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

To po prostu daje mi Laravel NotFoundHttpException w skompilowanym.php line 7610

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

Czy istnieje przyzwoita metoda usuwania 'public' w środowisku deweloperskim, które:

  1. Działa z L5
  2. pozwala mi łatwo przełączać się między projektami (Zwykle pracuję na 2 lub 3 w tym samym czasie).

Thanks

** używam MAMP i PHP 5.6.2

Author: Karl Hill, 2015-02-06

30 answers

Dla Laravel 5:

  1. Zmień nazwę server.php w głównym folderze Laravel na index.php
  2. skopiuj plik .htaccess z katalogu /public do katalogu głównego Laravel folder.

To jest to!

 443
Author: Asfaq Tamim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-12-20 12:22:12

NIE!

Naprawdę nie powinieneś zmieniać nazwy server.php w folderze głównym Laravel na index.php i skopiuj plik .htaccess z katalogu /public do folderu głównego Laravel!!!

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


DO

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

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

To po cichu przepisze wszystkie Twoje podstawowe Uri do folderu /public. Parzyste wszystkie nagłówki , na przykład nagłówek autoryzacji HTTP oraz wszystkie opcjonalne parametry URI zostaną również po cichu przekazane do folderu /public.

To wszystko

Uwaga podczas konfigurowania projektu Laravel za pomocą Dockera: nie musisz tego robić.

 143
Author: Derk Jan Speelman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-07-27 07:48:55

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

  1. zmiana nazwy serwera.php do indeksu.php (bez modyfikacji)
  2. skopiuj .htaccess z folderu publicznego do folderu głównego (jak rimon.ekjon said below)
  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ą potrzebne inne pliki statyczne wystarczy dodać rozszerzenie do poprzedniej zadeklarowanej listy

 131
Author: ka_lin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-16 20:13:08

In Laravel 5.5 create .plik htacess w katalogu głównym i umieścił następujący kod: - Reference Link

<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>
 109
Author: Raham,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-29 04:11:53

Łatwy sposób na usunięcie publicznego adresu URL z laravel 5. Musisz tylko obciąć indeks.php i .htaccess z katalogu publicznego i wklej go do katalogu głównego, to wszystko i zastąp dwie linie w indeksie.php as

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

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

 44
Author: Muhammad Sadiq,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-09-22 17:19:21

@Rimon.ekjon powiedział:

Zmień nazwę serwera.php w katalogu głównym Laravel do indeksowania.php i skopiuj .plik htaccess z katalogu / public do folderu głównego Laravel. -- To wszystko !! :)

To mi pasuje. Ale wszystkie pliki zasobów w katalogu / public nie mogły znaleźć i żądania adresów URL nie działały, ponieważ użyłem asset () helper.

Zmieniłem / Oświetliłem / Fundację / pomocników.funkcja php / asset () wygląda następująco:

function asset($path, $secure = null)
{
    return app('url')->asset("public/".$path, $secure);
}
Teraz wszystko działa :)

Dziękuję @rimon.ekjon i wy wszyscy.

2020 aktualizacja autora

Ta odpowiedź nie jest zalecana. Zamiast tego zaleca się obsługę pliku .htaccess.

 40
Author: Miron,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-09-28 07:53:24

Utwórz plik .htaccess w katalogu root 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>
 35
Author: Pallav Nagar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-03-23 11:25:33

Wystarczy utworzyć .htaccess plik w katalogu głównym i dodaj do niego te linie

<IfModule mod_rewrite.c>
    RewriteEngine On

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

Powyższy kod działa na głównym folderze public_html. Mówiąc, ż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 zadziała. Dlatego musisz skopiować wszystkie swoje podstawowe pliki do public_html i umieścić .plik htaccess .

Jeśli chcesz keep the code in a subdirectory then you can create a subdomain then this code will work for that also.

 29
Author: Abhinav Saraswat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-03 06:20:42

1) nie znalazłem metody roboczej do przenoszenia katalogu publicznego w L5 . Chociaż można modyfikować niektóre rzeczy w bootstrap index.php, wygląda na to, że kilka funkcji pomocniczych opiera się na założeniu, że znajduje się tam katalog publiczny. Szczerze mówiąc, nie powinieneś przenosić publicznego katalogu.

2) Jeśli używasz MAMP , powinieneś tworzyć nowe vhosty dla każdego projektu, każdego obsługującego publiczny katalog projektów. Po utworzeniu masz dostęp do każdego projekt po zdefiniowanej nazwie serwera w ten sposób:

http://project1.dev
http://project2.dev
 23
Author: Jeremy Schaffer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-12-28 19:51:49

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

Krok 1.skopiuj cały plik z public i wklej do root katalog

Krok 2.otwórz plik index.php zastąp przez

 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 usunąć wszystkie cache i pliki cookie.

 15
Author: piyush patel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-12-28 19:54:02

4 najlepsze sposoby, aby usunąć publiczne z adresu URL.

Jeśli użyłeś innej sztuczki, aby usunąć publiczne z adresu URL, takiej jak zmiana nazwy serwera.php do indeksu.php i przejście do ścieżki pliku core. Najwyraźniej, nie rób tego. To dlaczego Laravel nie podaje takiego rozwiązania, bo to nie jest właściwy sposób.

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

Przez dodanie a .plik htaccess do katalogu głównego, można uzyskać dostęp do strona internetowa bez publicznych

<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ń publiczne, tworząc wirtualny host w lokalnym

Podaję tutaj demo systemu operacyjnego Windows. Ale postaram się zdefiniować krok, aby każdy mógł łatwo wykonać krok. Możesz również badać w google dla tego samego dla danego systemu operacyjnego.

Krok 1: przejdź do C:\Windows\system32\drivers\etc \ otwórz plik "hosts" w administratorze mode.

Krok 2: Dodaj do niego następujący kod. Tutaj, daję ci demo nazwy projektu.lokalna nazwa domeny demo, możesz określić dowolny, jak chcesz. Spraw, by była stała w każdym miejscu.

127.0.0.1  projectname.local

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

Przypisy: Zmień główny dokument zgodnie z projektem Dodaj również nazwę domeny, jak zdefiniujesz w plik "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 ponowne uruchomienie Xampp lub Wamp i dostęp do adresu URL, jak http://projectname.local a Twój Laravel odpowie bez publicznego adresu URL.


3) Usuń publiczne, uruchamiając komendę w Laravel

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

   > php artisan serve

Jeśli chcesz uruchomić swój projekt na danym 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, wystarczy sprawdzić swój adres IP za pomocą wiersza poleceń, uruchamiając "ipconfig" po uruchomieniu adresu IP zgodnie z poleceniem.

> php artisan serve --host=192.168.0.177

Jeśli chcesz uruchomić swój projekt na określonym IP z określonym portem, to potrzebujesz następującej komendy.

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

4) Usuń publiczne na serwerze hostowanym lub na cpanel

Tutaj wpisz opis obrazka

Po zakończeniu projektu musisz hostować projekt na serwerze, następnie wystarczy ustawić root dokumentu w swojej domenie do folderu publicznego. Sprawdź poniższy zrzut ekranu.

Jak na screenie jeśli nie masz żadnego folderu projektu w public_html to wystarczy ustawić swój root dokumentu jak "public_html/public".

Odniesienie zaczerpnięte z tutaj

 13
Author: Mayank Dudakiya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-05 08:30:10

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

  1. Po prostu Wytnij plik .htaccess z katalogu / public do katalogu root i zastąp jego zawartość 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 plik .htaccess i to wszystko.

  3. Zmień nazwę pliku server.php na index.php. to wszystko enjoy!

 12
Author: tony pro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-03-23 11:15:29

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

Tutaj wpisz opis obrazka

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

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

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

I zmień je na to:

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

$app = require_once __DIR__.'/locale/bootstrap/app.php';
 11
Author: Angelo Joseph Salvador,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-19 17:26:17

Najlepsze podejście: Nie polecam usuwania public, zamiast on local computer create a virtual host point to public directory i on remote hosting change public to public_html and point your domain to this directory. Powód, cały kod laravel będzie bezpieczny, ponieważ jego jeden poziom w dół do katalogu publicznego:)

Metoda 1:

Zmieniam nazwę server.php na index.php i działa

Metoda 2:

To działa 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 indeks.php i wykonaj następujące zamienniki

Require DIR .'/../bootstrap / autoload.php";

Do

Require DIR ."/bootstrap / autoload.php";

I

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

Do

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

  1. teraz otwórz bootstrap / paths.php i zmiana ścieżki katalogu publicznego:

'public' = >DIR .'/../ public",

Do

'public' = >DIR .'/..',

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

 10
Author: Wasim A.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-12-15 05:52:54

Chciałbym dodać do @Humble Learner I zauważyć, że właściwą lokalizacją do "naprawy" ścieżki url dla zasobów jest / Illuminate/Routing / UrlGenerator.php/asset ().

Update the method to match:

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 obrazów. Wszystko na cele majątkowe.

 8
Author: Sean Perkins,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-02 03:10:56

Dla użytkownika XAMPP, aby usunąć publiczny z adresu url bez dotykania Laravel domyślnym systemem plików jest ustawienie wirtualnego hosta dla aplikacji, aby to zrobić jsut wykonaj następujące kroki

  1. Otwórz aplikację XAMPP control panel i zatrzymaj Apache. Należy pamiętać, że późne maszyny 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/extra lub gdziekolwiek znajdują się Twoje pliki XAMPP.

  3. Otwórz plik o nazwie httpd-vhosts.conf z edytorem tekstu.

  4. Wokół linii 19 znajdź # NameVirtualHost *:80 i odkomentuj lub usuń hash.

  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 poniżej, aby dodać swoje wirtualne katalogi hosta. Na przykład pracuję nad stroną o nazwie Eatery Engine, więc poniższy fragment pozwoli mi pracować z sub-domenami na mojej lokalnej instalacji:
<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 zlokalizowany w C:/Windows/System32/drivers/etc/hosts, gdzie hosts jest plikiem. Otwórz go notatnikiem.
  2. poszukaj nazwy # localhost rozdzielczość jest obsługiwana w samym DNS.

127.0.0.1 localhost

Rozdzielczość nazwy Localhost jest obsługiwana 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

 6
Author: sunny kashyap,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-27 09:05:26

Zawsze jest powód, aby mieć publiczny folder w konfiguracji Laravela, wszystkie publiczne materiały powinny być obecne w publicznym folderze,

Nie kieruj adresu ip / domeny do folderu głównego Laravela, ale kieruj go do folderu publicznego. Niebezpieczne jest wskazywanie adresu IP serwera do folderu głównego., bo o ile nie zapiszesz ograniczeń w .htaccess, można łatwo uzyskać dostęp do innych plików.,

Wystarczy wpisać warunek rewrite w pliku .htaccess i zainstalować rewrite moduł i Włącz moduł przepisywania, problem, który dodaje publiczne w trasie zostanie rozwiązany.

 5
Author: Reiah Paul Sam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-19 10:29:17
<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 od wewnątrz .pliki htaccess (co jest bardzo powszechnym przypadkiem użycia), edytuj domyślny VirtualHost za pomocą

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

Poniżej "DocumentRoot /var/www/html" dodaj następujące linie:

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

Uruchom ponownie Serwer:

sudo service apache2 restart
 3
Author: mujuonly,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-04-03 12:01:20

Wiem, że są to wiele rozwiązań dla tego problemu. Najlepszym i najłatwiejszym rozwiązaniem jest dodanie .htaccess plik w katalogu root .

Próbowałem odpowiedzi, które dostarczyliśmy dla tego problemu, jednak 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. And everything goes right

 3
Author: CHARITRA SHRESTHA,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-11-06 04:19:57

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>
 3
Author: Ghanshyam Nakiya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-19 06:05:41

Nawet jeśli nie zalecam umieszczania Laravela w folderze głównym, są przypadki, w których nie można tego uniknąć; w takich przypadkach powyższe metody nie działają dla zasobów, więc zrobiłem szybką poprawkę zmieniając htaccess: po skopiowaniu serwera.php do indeksu.edycja php .plik htaccess tak:

<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 zrobić, więc każdy może ją uaktualnić.

 2
Author: Plokko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-13 20:12:59

Laravel 5.5

Po zainstalowaniu Laravela po raz pierwszy stanąłem przed słynnym "problemem folderów publicznych" i wymyśliłem takie rozwiązanie, które według mojej osobistej opinii jest "czystsze" niż inne, które znalazłem w sieci.


Osiągnięcia

  • nie ma public słowa w URI
  • Chroń plik .env przed ciekawskimi ludźmi

Wszystko można zrobić po prostu edytując .htaccess za pomocą mod_rewrite i czterech prostych Zasady.


Kroki

  1. Przenieś plik .htaccess do public/.htaccess w głównym korzeniu
  2. Edytuj jak poniżej

Wszystko skomentowałem, więc powinno być jasne (mam nadzieję) również dla tych, którzy nigdy nie używali mod_rewrite (nie żebym był ekspertem, wręcz przeciwnie). Ponadto, aby zrozumieć zasady, musi być jasne, że w Laravel, jeśli Bill łączy się z https://example.com, https://example.com/index.php jest nał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 druga index.php jest odpowiedzialny 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ąca reguła (pierwotnie w public/.htaccess) może zostać usunięta. Ta sama zasada jest w rzeczywistości wyjaśniona w bardziej szczegółowy sposób w dwóch ostatnich regułach.

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

EDIT: chybiłem rozwiązanie Abhinava Saraswata i jego odpowiedź powinna być zaakceptowana. Tylko jedna, prosta i jasna zasada, która przekierowuje cały ruch do folderu publicznego bez modyfikowania żadnego pliku.

 2
Author: Brigo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-27 22:13:08

Po pierwsze możesz użyć tego kroku

Dla Laravel 5:

1. Zmień nazwę serwera.php w katalogu głównym Laravel do indeksowania.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 css i ścieżkę skryptu, ale będzie to męczące.

Propozycja Rozwiązania : po prostu możesz dokonać drobnych zmian w funkcji helpers::asset.

Dla tego :

  1. Otwórz vendor\laravel\framework\src\Illuminate\Foundation\helpers.php

  2. Goto line 130

  3. Napisz "public/".$path zamiast $path,

    function asset($path, $secure = null){
       return app('url')->asset("public/".$path, $secure);
    }
    
 2
Author: Ferhat KOÇER,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55

Czytałem jakiś artykuł wcześniej 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. 

Edycja indeksu.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';
 1
Author: Yousef Altaf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-10 15:31:52

Problem polega na tym, że jeśli wpiszesz / public i będzie on nadal dostępny w adresie url, dlatego stworzyłem poprawkę, która powinna być 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 publiczny z adresu url i da 404, a następnie przekieruje na adres url bez publicznego

 1
Author: Paul De Zwaan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-08-13 18:52:30

Utwórz nowy plik o nazwie .htaccess w katalogu głównego projektu i umieść w nim poniższy kod:

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

Uwaga: jeśli zmieniłeś server.php na {[3] } Powinieneś również zmienić nazwę w powyższym kodzie

 1
Author: Abd Abughazaleh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-11-01 08:12:51

Inną metodą, której używam, jest utworzenie dowiązania symbolicznego (w Linuksie, Nie wiem o Win) przy użyciu komendy ln w htdocs lub www tj. ln projectname/public project Strona jest zatem dostępna za pośrednictwem localhost / project

 0
Author: Eli Makumba,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-15 15:26:57

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

1) Jeśli używasz hostingu dedykowanego i masz dostęp do roota, możesz usunąć publiczne słowo kluczowe z adresu URL za pomocą hosta wirtualnego. Powinieneś podać DocumentRoot path z public. 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 roota do swojego hostingu, powinieneś genaratować nowy .plik htaccess w katalogu głównym i umieść kod jako 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>
Tutaj możesz uzyskać więcej referencji .
 0
Author: Vinod Joshi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-12-27 06:49:38

Utwórz .plik htaccess w katalogu głównym i wklej poniższy kod. To jest to: p

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
 0
Author: newbdeveloper,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-09-26 23:25:13

Możesz to zrobić w 2 prostych krokach]}

  1. Zmień nazwę pliku server.php w katalogu głównym projektu laravel.

  2. Utwórz plik .htaccess w katalogu głównym i wklej do niego poniższy kod

Options -MultiViews -Indexes

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

 0
Author: Deepak Rana,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-09-30 07:05:29