Laravel 5 - Öffentliche von URL entfernen


240

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

Ich möchte keine VM ausführen. 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 Wechseln zwischen Projekten umständlich.

Ich habe die Methode .htaccess mod_rewrite ausprobiert

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

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

Als ich vor einiger Zeit L4 ausprobiert habe, habe ich die Methode verwendet, um den Inhalt des öffentlichen Ordners in das Stammverzeichnis zu verschieben. Die Struktur von L5 ist sehr unterschiedlich und das Befolgen der gleichen Schritte hat Laravel völlig zerstört (der Server würde nur eine leere Seite zurückgeben).

Gibt es eine vernünftige Methode zum Entfernen von "public" in einer Entwicklungsumgebung, die:

  1. Funktioniert mit L5
  2. Ermöglicht es mir, problemlos zwischen Projekten zu wechseln (ich arbeite normalerweise gleichzeitig an 2 oder 3).

Vielen Dank

** Ich benutze MAMP und PHP 5.6.2


1
Die Ordnerstruktur in der Anleitung unterscheidet sich von meiner. Ich kann mir vorstellen, dass er L5 nicht verwendet. Ich habe die Änderungen, die er an der Bootstrap / Paths-Datei vorgenommen hat, weggelassen, da sie nicht vorhanden ist. Das Projekt scheint jedoch zu funktionieren. Denkst du das ist ok
user1537360

Mein Fehler ließ mich eine Antwort für L5
kamlesh.bar hinzufügen

kein Erfolg für das gleiche versuchen
kamlesh.bar

1
Es scheint zu funktionieren, indem nur die Pfade in der Datei index.php geändert werden, aber ich bin neu bei Laravel und kann daher offensichtlich nicht kommentieren, ob dies stabil / sicher ist.
user1537360

Die anderen Ordner / Dateien sollten sich unter Ihrem Dokumentstamm befinden.
Mike Rockétt

Antworten:


430

Für Laravel 5:

  1. Benennen Sie server.phpin Ihrem Laravel-Stammordner umindex.php
  2. Kopieren Sie die .htaccessDatei aus dem /publicVerzeichnis in Ihren Laravel-Stammordner.

Das ist es!


104
Was auch immer dies unsicher sein mag, stellen Sie sicher, dass niemand Ihre .envDatei anfordern kann , wenn Sie dies tun, es sei denn, Sie sind damit
einverstanden, dass

48
Dies würde nicht funktionieren, wenn Sie Ihre Assets über den relativen Pfad von root referenzieren, d. H. "/assets/styles.css" und so weiter. Ich habe immer noch Probleme damit, den besten Weg zu finden, um es über Server
bereitzustellen

1
Das funktioniert ... Aber gibt es irgendwelche Konsequenzen / Nachteile bei der Verwendung? Viele schlagen vor, einen virtuellen Host einzurichten oder Dateien manuell zu kopieren usw. Funktioniert dies auch in der Produktion?
Bogz

1
@GabLeRoux <Files "log.txt">Order Allow,DenyDeny from all</Files>behebt das von Ihnen angesprochene Problem. Ist es jetzt sicher oder mehr Risiko?
Schmetterling

1
@Butterflyit hängt von Ihrer Serverkonfiguration ab. Das obige wird nur blockieren log.txt. Stellen Sie einfach sicher, dass Sie vertrauliche Daten für die Öffentlichkeit blockieren. Wenn Sie Laravel verwenden und die Dokumentation sorgfältig lesen , sieht Ihre Webroot so aus project/public. Schauen Sie sich diese Stackoverflow-Diskussion an . Richten Sie Ihren Webserver ein und versuchen Sie es https://example.com/.envfür alle Fälle. Wenn Sie Ihre Passwörter sehen, betrachten Sie alles als gefährdet und ändern Sie alle Passwörter.
GabLeRoux

126

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 Stammordner (wie unten angegeben rimon.ekjon).
  3. Ändern Sie .htaccess ein wenig wie folgt für die Statik:

    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 zuvor deklarierten Liste hinzu


1
Hallo @KA_lin. Wie kann ich verhindern, dass jemand .env wie so localhost / oap / .env anzeigt
Fokwa Best

8
Hmmm ... tryRewriteRule ^.env - [F,L,NC]
ka_lin

2
Oder <Files ~ "\.env$"> Order allow,deny Deny from all </Files>
ka_lin

Vielen Dank @ka_lin, gibt es eine Möglichkeit, den Zugriff über / public / zu entfernen? Wie www.yoursite.com funktioniert, aber www.yoursite.com/public funktioniert auch. Ist es möglich, den letzten zu entfernen?
Adaba

8
Es funktioniert, aber CSS, JS und Bilder werden nicht
geladen

93

Erstellen Sie in Laravel 5.5 eine .htacess-Datei in Ihrem Stammverzeichnis und platzieren Sie den folgenden Code: - 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>

5
die beste Antwort! Der einzige, der in meinem Beispiel funktioniert hat, sollte definitiv mehr Stimmen haben
FiliusBonacci

Danke, das ist Arbeit für mich. Aber ich möchte wissen, ob es Sicherheitsprobleme gibt oder nicht.
Rahul Singh Chauhan

@rahulsinghChauhan mein Vergnügen. Lieber ich weiß nicht über Sicherheitsprobleme, aber es sollte sicher sein.
Raham

2
Was macht diese Regel RewriteRule ^ ^$1 [N?
Gonzo

Dies ist der einzige, der für mich gearbeitet hat ... vielen Dank
Arshad Ameen

84

NICHT!

SIE SOLLTEN WIRKLICH NICHTserver.php in Ihrem Laravel-Stammordner umbenennen index.php und die .htaccessDatei aus dem /publicVerzeichnis in Ihren Laravel-Stammordner kopieren !!!

Auf diese Weise kann jeder auf einige Ihrer Dateien zugreifen ( .envzum Beispiel). Versuch es selber. Das willst du nicht!


MACHEN

Stattdessen sollten Sie eine .htaccessDatei in Ihrem Stammverzeichnis wie folgt erstellen :

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

Dadurch werden alle Ihre Basis-URIs stillschweigend in den /publicOrdner umgeschrieben . Auch alle Header , z. B. der HTTP-Autorisierungsheader , und alle optionalen URI-Parameter werden stillschweigend an den /publicOrdner übergeben.

Das ist alles

Bitte beachten Sie beim Einrichten eines Laravel-Projekts mit Docker: Sie müssen dies nicht tun.


2
Es funktioniert gut in der Produktion, aber es funktioniert nicht in lokalen Vorschlägen?
Haritsinh Gohil

2
Das funktioniert perfekt! lokal und server danke für sicherheitshilfe!
Ghanshyam Nakiya

1
Hallo, @DerkJanSpeelman Ich versuche, meine Laravel-Dateien in einen Unterordner in meinem Hosting hochzuladen, z. B.: (Example.com/projects/laravel/blog) In diesem Fall müssen Besucher example.com/projects/laravel/blog/ besuchen. public, damit ich eine .htaccess-Datei mit Ihrem Code in das Stammverzeichnis des Blog-Ordners lege und möchte, dass sie in den öffentlichen Ordner umgeleitet wird. Aber es funktioniert nicht. Hier tritt der Fehler auf: Die angeforderte URL / public / wurde auf diesem Server nicht gefunden. Wie kann ich das lösen?
Shovon Das

1
Diese Antwort wird unterschätzt. Upvoted for Bold und hervorgehoben Don't. Es funktioniert absolut gut.
Varun Ved

2
Die perfekte Antwort
Alnassre

43

Einfache Möglichkeit, die Öffentlichkeit von Laravel 5 URL zu entfernen. Sie müssen nur index.php und .htaccess aus dem öffentlichen Verzeichnis ausschneiden und in das Stammverzeichnis einfügen, das ist alles, und zwei Zeilen in index.php als ersetzen

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

Hinweis : Die obige Methode ist nur für Anfänger gedacht, da sie möglicherweise Probleme beim Einrichten des virtuellen Hosts haben. Die beste Lösung besteht darin, den virtuellen Host auf dem lokalen Computer einzurichten und auf das öffentliche Verzeichnis des Projekts zu verweisen.


1
Nachdem diese CSS nicht geladen wurde, sind alle CSS öffentlich und die Öffentlichkeit wird aus der URL entfernt
Mr. Tomar

1
Sie können beim Laden "public /" vor die js- oder css-Dateien setzen, z. B. Html :: script ("public / js / ....."); - Aber die beste Lösung wäre virtueller Host ...
Muhammad Sadiq

39

@ rimon.ekjon sagte:

Benennen Sie die Datei server.php in Ihrem 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 bei mir. Aber alle Ressourcendateien im Verzeichnis / public konnten nicht gefunden werden und Anforderungs-URLs funktionierten nicht, da ich den Asset-Helfer () verwendet habe.

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

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

Jetzt funktioniert alles :)

Vielen Dank an @ rimon.ekjon und euch alle.


3
Dies ist kein guter Weg, um dieses Problem zu beheben, da Sie versuchen, im Herstellerverzeichnis zu aktualisieren, was keine gute Vorgehensweise ist.
Shadman

1
Sie müssen nur RewriteRule ^(.*)$ public/$1 [L]Ihre .htaccess-Datei hinzufügen, die Sie aus dem öffentlichen Verzeichnis kopiert haben, indem Sie diese Zeile entfernenRewriteRule ^(.*)/$ /$1 [L,R=301]
Shadman

29

Erstellen Sie einfach die .htaccess- Datei 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 im Stammordner public_html. Allerdings sollte sich Ihre Laravel-Kerndatei im Ordner public_html befinden. Wenn Ihr Verzeichnis wie public_html / laravelapp / public aussieht und Sie den obigen Code in laravelapp einfügen, funktioniert dies 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. Dieser Code funktioniert auch dafür.


Ich habe unten geantwortet, bevor ich Ihre Antwort gelesen habe, und dies muss die akzeptierte Antwort sein. Keine Dateiänderungen: nur eine einfache, clevere Regel.
Brigo

@ Raham was ist deine aktuelle URL?
Abhinav Saraswat

2
Ich möchte nur eine kurze Beschreibung über die Arbeit dieser Herren hinzufügen. Der obige Code funktioniert im Stammordner public_html (ich hatte auch Probleme). Nachdem ich gesagt habe, dass sich Ihre Laravel-Kerndatei im Ordner public_html befinden sollte, habe ich den Fehler gemacht, dass mein Verzeichnis wie public_html / laravelapp / public aussieht, wenn 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. Verweis auf centOS und Cpanel Hosting für Laravel.
Deepesh Thapa

Was sind die Mängel bei der Verwendung dieser Methode?
Script47

1
Ich hatte nur einen cPanel-Webshost und konnte das RootDirectory für Apache nicht ändern. Vielen Dank ! am einfachsten und sichersten. Dies erlaubt nicht, Ihren Stammordnerinhalt zu sehen
Vincent Decaux

27

Erstellen Sie eine .htaccessDatei im Stammverzeichnis und platzieren Sie den Code wie folgt.

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

1
Ich kann diese Lösung nur empfehlen.
TheLastCodeBender

1
Ich empfehle auch diese Lösung
iglesiasedd

Ich danke dir sehr. Dies ist perfekt (y)
Prappo Islam Prince

3
Es funktioniert gut, aber immer noch .env-Datei direkt über die URL zugänglich.
Manoj Singh

Ist es eine sichere Lösung?
Sr. PHP Programmer Teamleiter

23

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

2) Wenn Sie MAMP verwenden , sollten Sie für jedes Projekt neue vhosts erstellen, die jeweils das öffentliche Verzeichnis des Projekts bedienen. Nach der Erstellung greifen Sie über Ihren definierten Servernamen wie folgt auf jedes Projekt zu:

http://project1.dev
http://project2.dev

15

Es ist möglich, die Öffentlichkeit zu entfernen URL in laravel5 . Folge diesen Schritten:

Schritt 1.Kopieren alle Datei aus öffentlichen und fügen Sie ihn auf Root - Verzeichnis

Schritt 2. index.phpDatei öffnen durch ersetzen

 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.


Hallo, ich habe Ihre Methode ausprobiert und die obigen Schritte ausgeführt, aber sie zeigt die folgenden Fehler an: Warnung: require_once (D: \ Projects \ laravel / public / index.php): Stream konnte nicht geöffnet werden: Keine solche Datei oder kein solches Verzeichnis in D: \ Projects \ laravel \ server.php in Zeile 21 Schwerwiegender Fehler: require_once (): Fehler beim Öffnen erforderlich 'D: \ Projects \ laravel / public / index.php' (include_path = '.; C: \ xampp \ php \ PEAR' ) in D: \ Projects \ laravel \ server.php in Zeile 21
Ali Shahzad

Dies ist keine perfekte Antwort, sondern ein sehr unsicherer Weg.
Rohit

11

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

Geben Sie hier die Bildbeschreibung ein

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

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

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

und ändern Sie sie in diese:

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

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

11

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

  1. Schneiden Sie einfach Ihre .htaccessDatei 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 .htaccessDatei und das ist alles.

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


9

BESTER Ansatz: Ich werde nicht empfehlen, stattdessen public on local computer create a virtual host point to public directoryund zu entfernen on remote hosting change public to public_html and point your domain to this directory. Grund dafür ist, dass Ihr gesamter Laravel-Code sicher ist, da er eine Ebene tiefer in Ihrem öffentlichen Verzeichnis liegt :)

METHODE 1:

Ich umbenennen nur server.phpan index.phpund es funktioniert

Methode 2:

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

Hier ist meine Verzeichnisstruktur,

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

Befolgen Sie diese einfachen Schritte

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

erfordern DIR . '/ .. / bootstrap / autoload.php';

zu

erfordern DIR . '/ bootstrap / autoload.php';

und

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

zu

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

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

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

zu

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

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


Es ist für alles in Ordnung. Der Befehl artisan funktioniert jedoch nicht. Er zeigt nur "Eingabedatei konnte nicht geöffnet werden: artisan". Gibt es einen Vorschlag?
Kabir Hossain

Diese Methode hat funktioniert. Wenn Sie in Ordnung sind, Ihre Datenbankanmeldeinformationen Benutzern zur Verfügung zu stellen. localhost / laravel / .env
MasoodUrRehman

8

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 Sie in den Kerndateipfad. Mach das natürlich nicht. Warum gibt Laravel dann nicht die Lösung wie diese, weil es kein richtiger Weg ist, dies zu tun?

1) Entfernen Sie public mit htaccess in Laravel von der URL

Durch Hinzufügen einer .htaccess-Datei zum Stammverzeichnis können Sie ohne Veröffentlichung auf die Website zugreifen

<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 beliebig angeben können. Machen Sie es einfach an jedem Ort konstant.

127.0.0.1  projectname.local

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

Anmerkungen: Ändern Sie den Dokumentstamm gemäß Ihrem Projekt. Fügen Sie außerdem den von Ihnen definierten Domänennamen in die Datei "Hosts" ein.

<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 vorletzte wichtige Schritt besteht darin, Xampp oder Wamp neu zu starten und auf die URL zuzugreifen http://projectname.local 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 tun, sondern nur den folgenden Befehl von Ihrem Terminal oder Befehlszeilentool aus ausführen. Danach können Sie über die über die Befehlszeile angegebene URL auf Ihre Website zugreifen.

   > php artisan serve

Wenn Sie bereit sind, Ihr Projekt unter einer bestimmten IP-Adresse auszuführen, müssen Sie den folgenden Befehl ausführen. Wenn Sie im LAN arbeiten und anderen Personen den Zugriff auf Ihre Website von lokal aus ermöglichen möchten, müssen Sie nur Ihre IP-Adresse mithilfe der Befehlszeile überprüfen, indem Sie "ipconfig" ausführen, nachdem Sie Ihre IP-Adresse gemäß 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

Geben Sie hier die Bildbeschreibung ein

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

Wenn Sie laut Screenshot keinen Projektordner in public_html haben, müssen Sie nur Ihren Dokumentstamm wie folgt festlegen "public_html/public".

Referenz von hier genommen


1
Alle vier Möglichkeiten sind gut, aber ich habe mein Problem mit der ersten Lösung gelöst.
Manisha

7

Ich möchte @Humble Learner hinzufügen und beachten, dass der richtige Speicherort zum "Korrigieren" 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 Asset-Pfade.


6

Damit XAMPP-Benutzer public aus der URL entfernen können, ohne das Standarddateisystem von laravel zu berühren, müssen Sie einen virtuellen Host für Ihre Anwendung festlegen, um dies zu tun. Befolgen Sie dazu die folgenden Schritte

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

  2. Navigieren Sie zu C:/xampp/apache/conf/extraoder wo immer sich Ihre XAMPP-Dateien befinden.

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

  4. Suchen Sie in Zeile 19 # NameVirtualHost *:80und kommentieren Sie den Hash aus oder entfernen Sie ihn.

  5. Fügen Sie ganz unten in der Datei den folgenden Code ein:

<VirtualHost *>
    ServerAdmin admin@localhost.com
    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 beispielsweise an einer Site namens Eatery Engine, sodass ich mit dem folgenden Snippet bei meiner lokalen Installation mit Subdomains arbeiten kann:
<VirtualHost eateryengine.dev>
    ServerAdmin admin@localhost.com
    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 unterC:/Windows/System32/drivers/etc/hosts , wo Hosts die Datei ist. Öffnen Sie es mit dem Editor.
  2. Suchen Sie nach #localhost. Die Namensauflösung wird in DNS selbst durchgeführt.

127.0.0.1 localhost

Die Auflösung des lokalen Hostnamens erfolgt innerhalb von 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. Starten Sie Apache neu und testen Sie alles.

Den Originalartikel finden Sie hier


5

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

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

Schreiben Sie einfach die Umschreibbedingung in die .htaccessDatei, installieren Sie das Umschreibemodul und aktivieren Sie das Umschreibemodul. Das Problem, das die Route öffentlich macht, wird gelöst.


3

Ich weiß, dass dies eine Menge Lösungen für dieses Problem sind. Die beste und einfachste Lösung ist das Hinzufügen einer .htaccess- Datei im Stammverzeichnis .

Ich habe die Antworten ausprobiert, die wir für dieses Problem gegeben haben, aber ich hatte einige Probleme mit auth: api guard in Laravel.

Hier ist die aktualisierte Lösung:

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

Erstellen Sie die .htaccess-Datei in Ihrem Stammverzeichnis und fügen Sie diesen Code hinzu. Und alles geht gut


2

Laravel 5.5

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


Erfolge

  • Ich habe kein publicWort in der URI
  • Schützen Sie die .envDatei vor neugierigen Personen

Alles kann getan werden, .htaccessindem nur die Verwendung mod_rewriteund vier einfache Regeln bearbeitet werden .


Schritte

  1. Verschieben Sie die .htaccessDatei public/.htaccessin das Hauptstammverzeichnis
  2. Bearbeiten Sie es wie folgt

Ich habe alles kommentiert, daher sollte es auch denen klar sein (ich hoffe), die es noch nie benutzt haben mod_rewrite(nicht, dass ich ein Experte bin, im Gegenteil). Um die Regeln zu verstehen, muss außerdem klar sein, dass in Laravel, wenn Bill eine Verbindung herstellt https://example.com, https://example.com/index.phpgeladen wird. Diese Datei enthält nur den Befehl header("refresh: 5; https://example.com/public/"), an den die Anforderung gesendet wird https://example.com/public/index.php. Diese Sekunde index.phpist 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. Die gleiche 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 Saraswats Lösung verpasst und seine Antwort sollte die akzeptierte sein. Nur eine einfache und klare Regel, die den gesamten Datenverkehr in den öffentlichen Ordner umleitet, ohne eine Datei zu ändern.


2

Erstens können Sie diese Schritte verwenden

Für Laravel 5:

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

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

Quelle: 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 die helpers::assetFunktion einfach geringfügig ändern .

Dafür :

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

  2. gehe zu Zeile 130

  3. schreiben "public/".$pathstatt $path,

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

2
Regel Nummer 1: Bearbeiten Sie niemals eine Kerndatei. Auch wenn es jetzt einfach und schön aussieht, werden Sie später bezahlen.
Janaka Dombawela

@ JanakaDombawela Ich denke nicht so, weil:
Ferhat KOÇER

@JanakaDombawela Ich denke nicht so, weil: Senerio 1: Wenn Entwickler ein erfahrener: Open Source Code für diesen Job ist Senerio 2: Wenn Entwickler ein Junior ist, muss Entwickler den Quellcode bearbeiten, um Erfahrung zu sammeln
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>

Aktivieren Sie das mod_rewrite-Modul mit

sudo a2enmod rewrite

und starten Sie 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

1

Ich habe bereits einen Artikel gelesen und er funktioniert einwandfrei, weiß aber nicht, ob er 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

Auch wenn ich nicht empfehle, Laravel in den Stammordner zu legen, gibt es einige Fälle, in denen dies nicht vermieden werden konnte. In diesen Fällen funktionieren die oben genannten Methoden nicht für Assets. Daher habe ich eine schnelle Korrektur vorgenommen, um den htaccess zu ändern: Nachdem Sie server.php in index.php kopiert haben, 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 vornehmen musste, damit jeder sie aktualisieren kann.


1

Problem ist, wenn Sie / public eingeben und es weiterhin in der URL verfügbar ist, habe ich einen Fix erstellt, der in der public / index.php platziert 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 die Öffentlichkeit aus der URL und gibt eine 404 und leitet dann ohne die Öffentlichkeit zur URL weiter


0

Eine andere Methode, die ich verwende, ist das Erstellen eines symbolischen Links (unter Linux weiß ich nichts über Win) mit dem Befehl ln in htdocs oder www, dh ln projectname/public project die Site ist somit über localhost / project zugänglich


0

Sie können öffentliche Schlüsselwörter mit verschiedenen Methoden aus der URL entfernen.

1) Wenn Sie dediziertes Hosting verwenden und Root-Zugriff haben, können Sie öffentliche Schlüsselwörter mithilfe von Virtual Host aus der URL entfernen. Sie sollten den DocumentRoot-Pfad mit public angeben. Dies startet also den Index aus dem öffentlichen Verzeichnis und entfernt ihn aus der URL.

<VirtualHost *:80>
    ServerAdmin info@example.com
    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 Root-Verzeichnis erstellen und den folgenden Code 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 Informationen finden Sie hier.


0

Erstellen Sie eine .htaccess-Datei im Stammverzeichnis und platzieren Sie den Code wie folgt.

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

Erstellen Sie die .htaccess-Datei im Verzeichnis / public und platzieren Sie den Code wie folgt.

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

-1

Ich habe die funktionierendste Lösung für dieses Problem gefunden.

Bearbeiten nur .htaccessim Stammordner und schreiben Sie den folgenden Code ein . 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>

-1

Ich habe hier eine Lösung ausprobiert und festgestellt, dass htaccess für Laravel 5.2 wie folgt 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 Sie eine andere Datei oder einen anderen Ordner verboten haben, fügen Sie diese einfach hinzu

RewriteRule ^your_file - [F,L,NC]

-1

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

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

Dies leitet mich zu / public / public
zanderwar

@ Zanderwar, bitte, was ist die Laravel-Version? Ich hoffe auch, dass Sie Ihr Projekt nicht in einem Unterverzeichnis aus dem Hauptverzeichnis haben?
Victor Ifeanyi Ejiogu

Das Projekt ist root, die Version ist 5.6. * - Es befindet sich jedoch auf einer Subdomain, auf Shared Hosting. Leider zwingt diese cPanel-Installation Subdomains, einen Ordner in public_html zu haben
zanderwar
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.