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:
Vielen Dank
** Ich verwende MAMP und PHP 5.6.2
server.php
in Ihrem Laravel-Stammordner in index.php
um..htaccess
aus dem Verzeichnis /public
in Ihren Laravel-Stammverzeichnisordner Das ist es!
Ich habe das Problem mit 2 Antworten gelöst:
Ä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
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>
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';
@ 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.
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
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.
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. :)
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.
Angenommen, Sie haben alle anderen Dateien und Verzeichnisse in einem Ordner mit dem Namen "locale" abgelegt.
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 :)
Ich benenne einfach server.php
in index.php
um und es funktioniert
Dies funktioniert gut für alle Laravel-Versionen ...
Hier ist meine Verzeichnisstruktur,
/laravel/
... app
... bootstrap
... public
... etc
Folgen Sie diesen einfachen Schritten
erfordernDIR. '/ ../bootstrap/autoload.php';
zu
erfordernDIR. '/ bootstrap/autoload.php';
und
$ app = required_onceDIR. '/ ../bootstrap/start.php';
zu
$ app = required_onceDIR. '/ bootstrap/start.php';
'public' =>DIR. '/ ../public',
zu
'public' =>DIR. '/ ..',
und das ist es, jetzt versuchen Sie http: // localhost/laravel /
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.
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!
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!
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.
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.
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
Ö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.
Navigieren Sie zu C:/xampp/Apache/conf/extra
oder wo auch immer sich Ihre XAMPP-Dateien befinden.
Öffnen Sie die Datei httpd-vhosts.conf mit einem Texteditor.
Um Zeile 19 finden Sie # NameVirtualHost *:80
und entfernen Sie den Hashwert.
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>
<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>
C:/Windows/System32/drivers/etc/hosts
, wobei hosts die Datei ist. Öffnen Sie es mit dem Notizblock.127.0.0.1 localhost
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.
Den Originalartikel finden Sie hier
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.local
zuzugreifen, 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
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.
<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
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:
vendor\laravel\framework\src\Illuminate\Foundation\helpers.php
öffnen
zur Zeile 130
schreibe "public/".$path
anstelle von $path
,
function asset($path, $secure = null){
return app('url')->asset("public/".$path, $secure);
}
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
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
.__
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.
public
Wort in der URI.env
Vor NeugierigenAlles kann getan werden, indem einfach der .htaccess
Mit mod_rewrite
Und vier einfachen Regeln bearbeitet wird.
.htaccess
In public/.htaccess
Im HauptstammIch 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.
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';
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.
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)
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>
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]
##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>
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]
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.
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
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>