it-swarm.com.de

Laravel 5 - Public von URL entfernen

Ich weiß, dass dies eine sehr beliebte Frage ist, aber ich habe keine funktionierende Lösung für Laravel 5 finden können. Ich habe lange versucht, von Codeigniter zu migrieren, aber dieser komplizierte Installationsprozess hält mich immer wieder ab.

Ich möchte keine VM betreiben, dies scheint beim Umschalten zwischen Projekten nur umständlich zu sein.

Ich möchte mein Dokumentstammverzeichnis nicht auf den öffentlichen Ordner festlegen. Dies ist auch beim Umschalten zwischen Projekten umständlich.

Ich habe die .htaccess-Methode mod_rewrite ausprobiert

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

Dies gibt mir nur eine Laravel NotFoundHttpException in Zeile 7610 von compiled.php.

Als ich vor einiger Zeit L4 ausprobierte, habe ich die Methode zum Verschieben des Inhalts des Öffentlichen Ordners in das Stammverzeichnis verwendet. Die Struktur von L5 ist recht unterschiedlich und nach den gleichen Schritten wurde Laravel vollständig zerstört (der Server würde nur eine leere Seite zurückgeben).

Gibt es eine vernünftige Methode, um "public" in einer Entwicklungsumgebung zu entfernen, die:

  1. Funktioniert mit L5
  2. Erlaubt mir das einfache Wechseln zwischen Projekten (normalerweise arbeite ich an 2 oder 3).

Vielen Dank

** Ich verwende MAMP und PHP 5.6.2

184
user1537360

Für Laravel 5:

  1. Benennen Sie server.php in Ihrem Laravel-Stammordner in index.php um.
  2. Kopieren Sie die Datei .htaccess aus dem Verzeichnis /public in Ihren Laravel-Stammverzeichnisordner

Das ist es!

368
Asfaq Tamim

Ich habe das Problem mit 2 Antworten gelöst:

  1. Umbenennen der server.php in index.php (keine Änderungen)
  2. Kopieren Sie den .htaccess aus dem öffentlichen Ordner in den Root-Ordner
  3. Ändern Sie .htaccess etwas für Statik wie folgt:

    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]
    

    Wenn andere statische Dateien benötigt werden, fügen Sie die Erweiterung einfach der vorherigen deklarierten Liste hinzu

108
ka_lin

Erstellen Sie in Laravel 5.5 die .htaccess-Datei in Ihrem Stammverzeichnis, und fügen Sie den folgenden Code ein: - Referenzlink

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

Einfache Möglichkeit, public aus Laravel 5-URL zu entfernen . Sie müssen lediglich index.php und .htaccess aus dem öffentlichen Verzeichnis ausschneiden und im Stammverzeichnis einfügen

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

@ rimon.ekjon sagte:

Benennen Sie die server.php im Laravel-Stammordner in index.php um und kopieren Sie die .htaccess-Datei aus dem Verzeichnis/public in Ihren Laravel-Stammordner. -- Das ist es !! :)

Das funktioniert für mich .. __ Aber alle Ressourcendateien im/public-Verzeichnis konnten keine URLs finden und anfordern, da ich asset () helper verwendet habe.

Ich habe /Illuminate/Foundation/helpers.php/asset () wie folgt geändert:

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

Jetzt klappt alles :)

Vielen Dank @ rimon.ekjon und Ihnen allen.

35
Miron

1) Ich habe keine Arbeitsmethode zum Verschieben des öffentlichen Verzeichnisses in L5 gefunden. Während Sie einige Dinge im Bootstrap index.php ändern können, scheinen mehrere Hilfsfunktionen auf der Annahme zu beruhen, dass dieses öffentliche Verzeichnis vorhanden ist. Alles in allem sollten Sie das öffentliche Verzeichnis wirklich nicht verschieben.

2) Wenn SieMAMPverwenden, sollten Sie für jedes Projekt neue vhosts erstellen, die jeweils das öffentliche Verzeichnis des Projekts bereitstellen. Nach dem Erstellen greifen Sie auf jedes Projekt mit Ihrem definierten Servernamen wie folgt zu:

http://project1.dev
http://project2.dev
23
Jeremy Schaffer

Erstellen Sie einfach .htaccess file im Stammverzeichnis und fügen Sie diese Zeilen hinzu

<IfModule mod_rewrite.c>
    RewriteEngine On

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

Das ist es!

Der obige Code funktioniert für den Stammordner public_html. Allerdings sollte sich Ihre Kern-Laravel-Datei im Ordner public_html befinden, wenn Ihr Verzeichnis wie public_html/laravelapp/public aussieht und Sie den obigen Code in laravelapp einfügen, funktioniert es nicht. Daher müssen Sie alle Ihre Kerndateien in public_html kopieren und die .htaccess-Datei dort ablegen.

Wenn Sie den Code in einem Unterverzeichnis behalten möchten, können Sie eine Unterdomäne erstellen. Dann funktioniert auch dieser Code.

19

Auch wenn die in diesem Thread erwähnte Lösung für Sie funktioniert, würde ich Sie bitten, dies nicht zu tun. Hier ist der Grund warum.

Sie sollten Ihr Apache-Host-Stammverzeichnis auf das Verzeichnis $LARAVEL_PATH/public und nicht auf $LARAVEL_PATH verweisen. 

Das Unterverzeichnis für www Host root anstelle von project root besteht darin, dass Sie keine Ihrer Projektdateien über Ihren Webserver lecken.

Obwohl alle PHP -Dateien das Dateisuffix .php haben, kann ein böswilliger Benutzer auf Ihr $LARAVEL_PATH/storage-Verzeichnis und dessen Unterverzeichnisinhalt zugreifen, Ihren composer.json oder package.json lesen, um verwundbare Abhängigkeiten zu finden oder die .env-Datei usw. zu lesen.

Wenn Sie Shared Hosting ausführen und public_html verwenden müssen, installieren Sie Laravel außerhalb dieses public_html-Verzeichnisses und entfernen Sie entweder public_html (falls leer), und ersetzen Sie es durch symbolische Verknüpfung mit $LARAVEL_PATH/public OR, wenn die Laravel-Instanz sein soll Unterverzeichnis von public_html, machen Sie dasselbe, erstellen Sie jedoch einen Symlink von $LARAVEL_PATH/public zu public_html/$PROJECT_SUBDIR

Dieses öffentliche Verzeichnis ist ein Grund, das Projekt etwas sicherer zu machen. Lösen Sie das eigentliche Problem und versuchen Sie nicht, diese einfache, aber nette Sicherheitserweiterung zu brechen. :)

15

Es ist möglich, public url in laravel5 zu entfernen. Folge diesen Schritten:

schritt 1. Kopieren Sie alle Dateien aus dem Verzeichnis public und fügen Sie sie in das Verzeichnis root ein

schritt 2.Öffnen Sie index.php-Datei ersetzen mit

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

zu 

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

und 

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

zu 

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

Und entfernen Sie alle Cache und Cookies.

12
piyush patel

Angenommen, Sie haben alle anderen Dateien und Verzeichnisse in einem Ordner mit dem Namen "locale" abgelegt.

enter image description here

Gehen Sie einfach zu index.php und finden Sie diese beiden Zeilen:

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

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

und ändere sie dazu:

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

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

BEST Approach: Ich werde das Entfernen von public nicht empfehlen, stattdessen on local computer create a virtual Host point to public directory und on remote hosting change public to public_html and point your domain to this directory. Grund ist, dass Ihr gesamter Laravel-Code sicher ist, da er nur eine Ebene bis zu Ihrem öffentlichen Verzeichnis ist :) 

METHODE 1:

Ich benenne einfach server.php in index.php um und es funktioniert

Methode 2:

Dies funktioniert gut für alle Laravel-Versionen ...

Hier ist meine Verzeichnisstruktur,

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

Folgen Sie diesen einfachen Schritten

  1. alle Dateien aus dem öffentlichen Verzeichnis nach root/laravel/verschieben
  2. jetzt kein öffentliches Verzeichnis mehr erforderlich, optional können Sie es jetzt entfernen
  3. Öffnen Sie jetzt index.php und nehmen Sie folgende Ersetzungen vor 

erfordernDIR. '/ ../bootstrap/autoload.php'; 

zu 

erfordernDIR. '/ bootstrap/autoload.php'; 

und

$ app = required_onceDIR. '/ ../bootstrap/start.php'; 

zu

$ app = required_onceDIR. '/ bootstrap/start.php';

  1. Öffnen Sie nun bootstrap/paths.php und ändern Sie den Pfad zum öffentlichen Verzeichnis:

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

zu

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

und das ist es, jetzt versuchen Sie http: // localhost/laravel /

8
Wasim A.

Ich möchte @Humble Learner hinzufügen und beachten, dass der richtige Pfad zum "Fixieren" des URL-Pfads für Assets /Illuminate/Routing/UrlGenerator.php/asset () ist.

Aktualisieren Sie die Methode entsprechend:

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

Dadurch werden Skripte, Stile und Bildpfade korrigiert. Alles für Vermögenspfade. 

6
Sean Perkins

Hier ist die beste und kürzeste Lösung, die für mich ab dem may, 2018 .__ für Laravel 5.5 funktioniert.

1- Schneiden Sie einfach Ihre .htaccess-Datei aus dem Verzeichnis/public in das Stammverzeichnis und ersetzen Sie den Inhalt durch den folgenden Code:

<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- Speichern Sie einfach die .htaccess-Datei und das ist alles.

3- Benennen Sie Ihre server.php-Datei in index.php um. das ist alles genießen!

5
tony pro

Nicht:

Sie sollten wirklich nicht server.php in Ihrem Laravel-Stammordner in index.php .__ umbenennen und die .htaccess-Datei aus dem Verzeichnis/public in Ihren Laravel-Stammordner kopieren!

Auf diese Weise kann jeder auf einige Ihrer Dateien zugreifen (z. B. .env). Das willst du nicht!


Tun:

Stattdessen sollten Sie eine .htaccess-Datei in Ihrem Root-Verzeichnis wie folgt erstellen:

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

Das ist es.

4

Es gibt immer einen Grund, einen öffentlichen Ordner im Laravel-Setup zu haben. Alle öffentlichen Inhalte sollten im öffentlichen Ordner vorhanden sein. 

Verweisen Sie Ihre IP-Adresse/Domain nicht auf den Root-Ordner von Laravel, sondern auf den öffentlichen Ordner. Es ist nicht sicher, den Server-Ip auf den Stammordner zu verweisen. Wenn Sie keine Einschränkungen in .htaccess schreiben, können Sie problemlos auf die anderen Dateien zugreifen. 

Schreiben Sie einfach die Umschreibungsbedingung in die .htaccess-Datei und installieren Sie das Umschreibungsmodul, und aktivieren Sie das Umschreibungsmodul.

4
Reiah Paul Sam

Wenn XAMPP-Benutzer public aus der URL entfernen möchten, ohne das Standard-Dateisystem von Laravel zu berühren, müssen Sie einen virtuellen Host für Ihre Anwendung festlegen

  1. Öffnen Sie die Anwendung XAMPP Control Panel und stoppen Sie Apache. Beachten Sie, dass spätere Windows-Computer es möglicherweise als Dienst ausführen. Aktivieren Sie das Kontrollkästchen links neben dem Apache-Modul.

  2. Navigieren Sie zu C:/xampp/Apache/conf/extra oder wo auch immer sich Ihre XAMPP-Dateien befinden.

  3. Öffnen Sie die Datei httpd-vhosts.conf mit einem Texteditor.

  4. Um Zeile 19 finden Sie # NameVirtualHost *:80 und entfernen Sie den Hashwert.

  5. Fügen Sie am Ende der Datei den folgenden Code ein: 

<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. Jetzt können Sie den obigen Code kopieren und einfügen, um Ihre Virtual Host-Verzeichnisse hinzuzufügen. Ich arbeite zum Beispiel an einer Site namens Eatery Engine, sodass ich mit dem folgenden Snippet bei meiner lokalen Installation mit Subdomains arbeiten kann: 
<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. Gehen Sie als Nächstes zu Ihrer Windows-Hostdatei, um Ihre HOSTS zu bearbeiten. Die Datei befindet sich unter C:/Windows/System32/drivers/etc/hosts, wobei hosts die Datei ist. Öffnen Sie es mit dem Notizblock.
  2. Achten Sie darauf, dass die Namensauflösung von #localhost in DNS selbst gehandhabt wird.

127.0.0.1 localhost

die Auflösung von localhost-Namen wird in DNS selbst behandelt.

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. Starten Sie Apache neu und testen Sie alles.

Den Originalartikel finden Sie hier

4
sunny kashyap

4 beste Möglichkeiten, um public von der URL zu entfernen.

Wenn Sie einen anderen Trick verwendet haben, um die Öffentlichkeit von der URL zu entfernen, ändern Sie beispielsweise den Namen von server.php in index.php und wechseln in den Kerndateipfad. Ganz klar, tu das nicht. Warum gibt Laravel die Lösung nicht so an, weil dies nicht der richtige Weg ist, dies zu tun?.

1) Entferne public von der URL mit htaccess in Laravel

Durch Hinzufügen einer .htaccess-Datei zum Stammverzeichnis können Sie auf die Website zugreifen, ohne diese zu öffnen

<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) Entfernen Sie die Öffentlichkeit, indem Sie einen virtuellen Host in Ihrem lokalen erstellen

Ich gebe hier eine Demo für das Windows-Betriebssystem. Aber ich werde versuchen, einen Schritt zu definieren, damit jeder dem Schritt leicht folgen kann. Sie können auch auf Google nach dem gleichen für das jeweilige Betriebssystem suchen.

Schritt 1: Gehen Sie zu C:\Windows\system32\drivers\etc\und öffnen Sie die Datei "hosts" im Administratormodus.

Schritt 2: Fügen Sie den folgenden Code hinzu. Hier gebe ich Ihnen eine Demo von projectname.local Domain Name Demo, die Sie nach Belieben angeben können. Machen Sie es einfach an jedem Ort konstant.

127.0.0.1  projectname.local

Schritt 3: Nun gehe zu C:\xampp\Apache\conf\extra für xampp Benutzer und für den wamp Benutzer "C:\wamp\bin\Apache\Apache2.4.4\conf\extra" und "httpd-vhosts.conf" Datei öffnen. Fügen Sie nun den folgenden Code hinzu.

Anmerkungen:Ändern Sie das Stammverzeichnis des Dokuments gemäß Ihrem Projekt und fügen Sie den in der Datei "hosts" definierten Domänennamen hinzu.

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

Schritt 4: Der letzte wichtige Schritt ist, Xampp oder Wamp neu zu starten und auf die URL wiehttp://projectname.localzuzugreifen, und Ihr Laravel antwortet ohne öffentliche URL.


3) Entfernen Sie die Öffentlichkeit, indem Sie den Befehl in Laravel ausführen.

Wenn Sie lokal arbeiten, müssen Sie nichts weiter tun, als den folgenden Befehl von Ihrem Terminal oder Befehlszeilentool aus auszuführen. Danach können Sie über die Befehlszeile unter der angegebenen URL auf Ihre Website zugreifen.

   > php artisan serve

Wenn Sie bereit sind, Ihr Projekt auf einer bestimmten IP auszuführen, müssen Sie den folgenden Befehl ausführen. Wenn Sie im LAN arbeiten und anderen Benutzern den lokalen Zugriff auf Ihre Website ermöglichen möchten, müssen Sie lediglich Ihre IP-Adresse über die Befehlszeile überprüfen, indem Sie "ipconfig" ausführen, nachdem Sie Ihre IP-Adresse nach dem Befehl ausgeführt haben.

> php artisan serve --Host=192.168.0.177

Wenn Sie bereit sind, Ihr Projekt auf einer bestimmten IP mit einem bestimmten Port auszuführen, müssen Sie den folgenden Befehl ausführen.

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

4) Entfernen Sie die Öffentlichkeit auf dem gehosteten Server oder auf dem cpanel

 enter image description here 

Nach Abschluss des Projekts müssen Sie das Projekt auf dem Server hosten. Anschließend müssen Sie nur den Dokumentenstamm in Ihrer Domäne auf den öffentlichen Ordner festlegen. Überprüfen Sie den folgenden Screenshot.

Wenn Sie keinen Projektordner in public_html haben, müssen Sie gemäß Screenshot lediglich Ihren Dokumentenstamm auf "public_html/public" setzen.

3
Mayank Dudakiya
<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>

Aktivieren Sie das Modul mod_rewrite mit

Sudo a2enmod rewrite

und starte den Apache neu

Sudo service Apache2 restart

Um mod_rewrite aus .htaccess-Dateien heraus zu verwenden (was ein sehr häufiger Anwendungsfall ist), bearbeiten Sie den Standard-VirtualHost mit

Sudo nano /etc/Apache2/sites-available/000-default.conf

Fügen Sie unter "DocumentRoot/var/www/html" die folgenden Zeilen hinzu:

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

Starten Sie den Server erneut:

Sudo service Apache2 restart
2
mujuonly

Erstens können Sie diese Schritte verwenden

Für Laravel 5:

1. Benennen Sie server.php in Ihrem Laravel-Stammverzeichnis um in index.php 

2. Kopieren Sie die .htaccess-Datei aus dem Verzeichnis/public in Ihren Laravel-Stammordner. 

source: https://stackoverflow.com/a/28735930

nachdem Sie diese Schritte ausgeführt haben, müssen Sie alle CSS- und Skriptpfade ändern. Dies ist jedoch anstrengend.

Lösungsvorschlag: Sie können einfach die helpers::asset-Funktion geringfügig ändern.

Dafür:

  1. vendor\laravel\framework\src\Illuminate\Foundation\helpers.php öffnen

  2. zur Zeile 130 

  3. schreibe "public/".$path anstelle von $path

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

Das Problem ist, wenn du/public eingibst und es weiterhin in der URL verfügbar ist. Deshalb habe ich ein Update erstellt, das in der public/index.php abgelegt werden sollte

  $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;
   }}

dieser Code-Frieden entfernt public aus der URL und gibt ein 404 und leitet dann zur URL ohne public weiter

1
Paul De Zwaan

Eine andere Methode, die ich verwende, ist das Erstellen eines symbolischen Links (in Linux kennen Sie Win nicht), indem Sie den Befehl ln in htdocs oder www verwenden, d. H. ln projectname/public project.__

1
Eli Makumba

Laravel 5.5

Nachdem ich Laravel zum ersten Mal installiert hatte, sah ich mich mit dem bekannten "Problem mit öffentlichen Ordnern" konfrontiert und fand eine Lösung, die meiner persönlichen Meinung nach , ist "sauberer" als die anderen, die ich im Web gefunden habe.


Erfolge

  • Kein public Wort in der URI
  • Schützen Sie die Datei .env Vor Neugierigen

Alles kann getan werden, indem einfach der .htaccess Mit mod_rewrite Und vier einfachen Regeln bearbeitet wird.


Schritte

  1. Verschieben Sie die Datei .htaccess In public/.htaccess Im Hauptstamm
  2. Bearbeiten Sie es wie folgt

Ich habe alles kommentiert, daher sollte es auch denen klar sein (ich hoffe), die noch nie mod_rewrite Benutzt haben (nicht, dass ich ein Experte bin, im Gegenteil). Um die Regeln zu verstehen, muss auch klar sein, dass in Laravel, wenn Bill eine Verbindung zu https://example.com Herstellt, https://example.com/index.php Geladen wird. Diese Datei enthält nur den Befehl header("refresh: 5; https://example.com/public/"), der die Anfrage an https://example.com/public/index.php Sendet. Dieser zweite index.php Ist dafür verantwortlich, den Controller und andere Dinge zu laden.

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

Die folgende Regel (ursprünglich in public/.htaccess) Kann gelöscht werden. Dieselbe Regel wird in den letzten beiden Regeln ausführlicher erläutert.

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

EDIT: Ich habe Abhinav Saraswat 's Lösung verpasst und seine Antwort sollte akzeptiert werden einer. Nur eine einfache und klare Regel, die den gesamten Datenverkehr in den öffentlichen Ordner umleitet, ohne dass eine Datei geändert wird.

1
Brigo

Ich habe schon einige Artikel gelesen und es funktioniert gut, weiß aber nicht, ob es sicher ist oder nicht

    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. 

Bearbeiten Sie die index.php

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

zu

require __DIR__.'/local/bootstrap/autoload.php';
$app = require_once __DIR__.'/local/bootstrap/app.php';
1
Yousef Altaf

Selbst wenn ich nicht empfehle, Laravel in den Root-Ordner zu legen, gibt es einige Fälle, in denen dies nicht vermieden werden konnte. Für diese Fälle funktionieren die oben genannten Methoden nicht für Assets. Daher habe ich schnell eine Änderung vorgenommen, die den Zugriff auf htaccess geändert hat: Nach dem Kopieren von server.php nach index.php bearbeiten Sie die .htaccess-Datei wie folgt:

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

Dies war eine schnelle Lösung, die ich machen musste, also kann jeder es aktualisieren.

1
Plokko
 You can follow only 2 step


 1- cut .htaccess from public folder and paste to root(mainFolder)  
 2- Rename server.php file to index.php AT your root dir. (mainFolder) 
0
Yagnesh bhalala

Sie müssen nicht viel tun, erstellen Sie einfach eine .htaccess-Datei im Stammverzeichnis und fügen Sie das Folgende ein/speichern Sie es.

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

Bitte fügen Sie diese Zeile in Ihren Root-Htaccess-Ordner ein, der die Arbeit von RewriteEngine auf RewriteCond% {REQUEST_URI} erledigt! Public/RewriteRule (. *)/Public/$ 1 [L]

0
Yugaprashanthan
##Create .htaccess file in root directory and place code something like below.

<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>
0
Pallav Nagar

ich habe hier eine Lösung ausprobiert und festgestellt, dass htaccess für Laravel 5.2 funktioniert:

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]

wenn du eine andere datei oder einen anderen ordner zum verbieten hast einfach hinzufügen

RewriteRule ^your_file - [F,L,NC]
0
adam

Sie können das öffentliche Schlüsselwort mit verschiedenen Methoden aus der URL entfernen.

1) Wenn Sie dediziertes Hosting verwenden und über Rootzugriff verfügen, können Sie das öffentliche Schlüsselwort mithilfe von Virtual Host aus der URL entfernen. Sie sollten den DocumentRoot-Pfad mit public angeben. Dies startet den Index aus dem öffentlichen Verzeichnis und entfernt ihn aus der 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) Wenn Sie keinen Root-Zugriff auf Ihr Hosting haben, sollten Sie eine neue .htaccess-Datei in Ihrem Stammverzeichnis erstellen und den Code wie folgt eingeben

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

Weitere Referenzen erhalten Sie hier.

0
Vinod Joshi

Schritt 1: server.php Datei im Stammverzeichnis umbenennen in index.php

Schritt 2:

kopieren Sie die .htaccess-Datei aus dem öffentlichen Verzeichnis in das root-Verzeichnis

0

Ich habe die funktionierende Lösung für dieses Problem gefunden. Bearbeiten Sie einfach Ihre .htaccess-Datei im Stammverzeichnis und schreiben Sie den folgenden Code. Sonst nichts erforderlich

  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>
0
AKHIL RAJ