Wie kann ich "public / index.php" in der URL Generated Laravel entfernen?

87

Ich muss die generierte URL in Laravel entfernen index.phpoder public/index.phpdaraus entfernen . Üblicherweise ist der Weg localhost/public/index.php/someWordForRoute: Es sollte so etwas wie seinlocalhost/someWordForRoute.

.htaccess

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

RewriteEngine On

# Redirect Trailing Slashes.
RewriteRule ^(.*)/$ /$1 [L,R=301]

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

app / config / app.php

'url' => 'http://localhost',

Wie kann ich das ändern?

TuGordoBello
quelle
7
Hübsche URLs in Laravel . Stellen Sie sicher, dass mod_rewriteaktiviert ist.
Kryten
@ Kryten funktioniert nicht = /
TuGordoBello
2
Dies ist die Lösung, wenn die andere Lösung nicht funktioniert dev-metal.com/enable-mod_rewrite-ubuntu-14-04-lts
TuGordoBello
/var/www/project_name/public
Zeigt

Antworten:

126

Option 1: Verwenden Sie .htaccess

Wenn es noch nicht vorhanden ist, erstellen Sie eine .htaccess-Datei im Laravel-Stammverzeichnis. Erstellen Sie eine .htaccessDatei in Ihrem Laravel-Stammverzeichnis, falls diese noch nicht vorhanden ist. (Normalerweise befindet es sich unter Ihrem public_htmlOrdner)

Bearbeiten Sie die .htaccess-Datei so, dass sie den folgenden Code enthält:

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

Jetzt sollten Sie ohne den Teil "/public/index.php/" auf die Website zugreifen können.

Option 2: Verschieben Sie die Objekte im Verzeichnis '/ public' in das Stammverzeichnis

Erstellen Sie einen neuen Ordner in Ihrem Stammverzeichnis und verschieben Sie alle Dateien und Ordner mit Ausnahme des öffentlichen Ordners. Sie können es so nennen, wie Sie wollen. Ich werde "laravel_code" verwenden.

Verschieben Sie anschließend alles aus dem öffentlichen Verzeichnis in den Stammordner. Es sollte etwas Ähnliches ergeben: Geben Sie hier die Bildbeschreibung ein

Danach müssen wir nur noch die Speicherorte in der laravel_code/bootstrap/paths.phpDatei und in der Datei bearbeiten index.php.

In laravel_code/bootstrap/paths.phpfinden Sie die folgende Codezeile:

'app' => __DIR__.'/../app',
'public' => __DIR__.'/../public',

Und ändern Sie sie zu:

'app' => __DIR__.'/../app',
'public' => __DIR__.'/../../',

In index.phpfinden Sie diese Zeilen:

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

Und ändern Sie sie zu:

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

Quelle: So entfernen Sie / public / von der URL in Laravel

Luzan Baral
quelle
5
Wenn Sie Debian Linux verwenden, vergessen Sie nicht, die etc/apache2/apache2.confÄnderung von der Stelle AllowOverride Nonezu ändern , AllowOverride Allan der Sie die Verzeichniskonfiguration sehen <Directory /var/www/></Directory>.
Robin Hood
1
Ich musste nur die .htaccess-Datei in meinem Stammverzeichnis haben, damit sie funktioniert.
Mário Rodrigues
7
Der Wechsel zu / root ist im Produktionsmodus überhaupt kein guter Rat! Es gibt einen Grund, warum der öffentliche Ordner existiert
toesslab
Um die Rewrite - Regeln Arbeit Prüfung sicherstellen , dass die Apache - Konfiguration <Directory ...Config hat AllowOverride All'so etwas wie dieses: <Directory "/var/www/html/laravel/public"> Options Indexes FollowSymLinks MultiViews **AllowOverride All** </Directory>
Japhet Ongeri - inkalimeva
Was ist, wenn ich beim Hosting keinen Conf-Zugriff habe?
Peter
40

Ich habe dies auf Laravel 4.2 versucht

Benennen server.phpSie index.phpdie .htaccessDatei in Ihrem Laravel-Stammordner um und kopieren Sie die Datei aus dem /publicVerzeichnis in Ihren Laravel-Stammordner.

Ich hoffe, es funktioniert

Tejas Jadhav
quelle
1
Wenn die von Luazan akzeptierte Antwort nicht funktioniert, reicht dies aus. Obwohl ich sicherstellen würde, dass die Datei index.php im öffentlichen Ordner bearbeitet wird, um Benutzer aus der Öffentlichkeit umzuleiten, wenn sie direkt zu diesem Link wechseln.
Brad Bird
4
Die js und css Dateien werden nicht mehr aus dem öffentlichen Ordner geladen
llioor
@ MaHDyfo - warum ist es nicht sicher? und wie ?
151291
2
@ 151291, da die .env-Datei für alle zugänglich ist, die Ihre Site auf diese Weise besuchen. es sei denn, Sie sichern Ihren Webserver, um dies zu vermeiden.
Mahdyfo
17

Verwechseln Sie sich nicht mit anderen Optionen, die ich unten verwende, und sie werden auch für Sie nützlich sein. Legen Sie die folgenden Htacces in Ihre Wurzel.

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

Gehen Sie in Ihr öffentliches Verzeichnis und legen Sie eine weitere htaccess-Datei mit dem folgenden Code-Snippet ab

<IfModule mod_rewrite.c>
    RewriteEngine On
    # Removes index.php from ExpressionEngine URLs  
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php?url=$1 [PT,L]

</IfModule>

Es funktioniert... !!!

Laravel Verwendet unter .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]
Ankit Vishwakarma
quelle
Großartig: Können Sie mir sagen, was Vor- und Nachteile dieser Methode sind?
Muhammad Ateek
Ich habe nur die .htaccess in root (Ihr erstes Snippet) bearbeitet und das hat es für mich behoben, danke!
Peird
13

HIER SIND EINFACHE SCHRITTE ZUM ENTFERNEN DER ÖFFENTLICHEN URL (Laravel 5)

1: Kopieren Sie alle Dateien aus dem öffentlichen Ordner und fügen Sie sie in den Laravel-Stammordner ein

2: Öffnen Sie index.php und ändern Sie

Von

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

In Laravel 4 ist Pfad 2 $app = require_once __DIR__.'/bootstrap/start.php';anstelle von$app = require_once __DIR__.'/bootstrap/app.php';/app.php

Das ist es.

Khandad Niazi
quelle
Gibt es weitere Komplikationen bezüglich anderer Links von der Website?
Haring10
Das sieht nach einer großartigen Lösung aus und ist auch einfach. Aber wirklich, wie Haring10 sagte. Gibt es irgendwelche Probleme damit?
Peter
10

1) Überprüfen Sie, ob mod_rewrite aktiviert ist. Gehen Sie zum /etc/apache2/mods-enabledVerzeichnis und prüfen Sie, ob das rewrite.loadverfügbar ist. Wenn nicht, aktivieren Sie es mit dem Befehl. sudo a2enmod rewriteDas Rewrite-Modul wird aktiviert. Wenn es bereits aktiviert ist, wird die Nachricht angezeigt Module rewrite already enabled.
2) Erstellen Sie einen virtuellen Host für das öffentliche Verzeichnis, damit http://localhost/public/index.phpwir ihn nicht verwenden können http://example.com/index.php. [daher wird der Name des öffentlichen Ordners ausgeblendet]
3) Erstellen Sie dann einen .htaccess, der die index.php vor Ihrer URL verbirgt, die sich im Stammverzeichnis (öffentlicher Ordner) befinden soll.

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?/$1 [L]
Orchidee
quelle
1
Versuchte deine Schritte. Habe noch kein Ergebnis! Ich weiß nicht, warum das passiert!
Mostafiz Rahman
Geben Sie die Protokollinformationen an, damit wir die Grundursache verfolgen können
Orchid
Hier ist die vollständige Protokolldatei: dropbox.com/s/8fhlbej86nqr5qj/laravel.log?dl=0
Mostafiz Rahman
arbeitete für mich. Lassen Sie den virtuellen Host nicht direkt in den öffentlichen Ordner wechseln.
Cardi777
Danke dir. Das hat bei mir funktioniert, mein mod_rewritewar behindert.
Maubeh
5

Dies hat wahrscheinlich sehr wenig mit Laravel und alles mit Ihren Apache-Konfigurationen zu tun.

Haben Sie Zugriff auf Ihre Apache-Serverkonfiguration? Wenn ja, lesen Sie dies in den Dokumenten nach:

Im Allgemeinen sollten Sie .htaccess-Dateien nur verwenden, wenn Sie keinen Zugriff auf die Konfigurationsdatei des Hauptservers haben. Es gibt beispielsweise ein weit verbreitetes Missverständnis, dass die Benutzerauthentifizierung immer in .htaccess-Dateien erfolgen sollte, und in den letzten Jahren ein weiteres Missverständnis, dass mod_rewrite-Direktiven in .htaccess-Dateien enthalten sein müssen. Dies ist einfach nicht der Fall. Sie können Benutzerauthentifizierungskonfigurationen in die Hauptserverkonfiguration einfügen. Dies ist in der Tat die bevorzugte Vorgehensweise. Ebenso funktionieren mod_rewrite-Direktiven in vielerlei Hinsicht in der Hauptserverkonfiguration besser.

... Im Allgemeinen sollte die Verwendung von .htaccess-Dateien nach Möglichkeit vermieden werden. Jede Konfiguration, die Sie in eine .htaccess-Datei einfügen möchten, kann genauso effektiv in einem Abschnitt in Ihrer Hauptserver-Konfigurationsdatei vorgenommen werden.

Quelle: Apache-Dokumentation .

Der Grund, warum ich dies zuerst erwähne, ist, dass es am besten ist, es .htaccessvollständig zu entfernen, wenn Sie können, und ein DirectoryTag innerhalb eines VirtualHostTags zu verwenden. Abgesehen davon wird der Rest davon ausgehen, dass Sie .htaccessaus irgendeinem Grund auf der Route bleiben .

Um dies aufzuschlüsseln, könnten einige Dinge passieren:

  1. Ich .htaccesstelle vielleicht sinnlos fest, dass Ihre Datei in Ihrer Frage benannt ist. Ich vermute, dass es sich um einen Tippfehler handelt, aber bei der Gelegenheit, dass Sie ihn übersehen haben und tatsächlich nur das zweite s fehlt, ist dies genau der kleine Fehler, der mich dazu bringen würde, meinen Kopf gegen die Wand zu schlagen und nach etwas Herausforderndem zu suchen .

  2. Ihr Server konnte dies nicht zulassen .htaccess. Um dies zu überprüfen, gehen Sie zu Ihrer Apache-Konfigurationsdatei. In modernen Apache-Builds befindet sich dies normalerweise nicht in einer Konfigurationsdatei. Stellen Sie daher sicher, dass Sie diejenige verwenden, die auf Ihre App verweist, wo immer sie vorhanden ist. Veränderung

    AllowOverride none

    zu

    AllowOverride all

    In der Folge empfehlen die Apache-Dokumente außerdem, dass Sie dies aus Sicherheitsgründen nicht für jeden Ordner tun, wenn Sie das .htaccessUmschreiben vornehmen möchten. Tun Sie dies stattdessen für die Ordner, zu denen Sie hinzufügen müssen .htaccess.

  3. Haben Sie mod_rewriteaktiviert? Das könnte die Probleme verursachen. Ich stelle fest, dass Sie das Etikett oben haben <IfModule mod_rewrite.c>. Versuchen Sie, diese Tags auskommentieren und Apache neu starten. Wenn Sie eine Fehlermeldung erhalten, liegt dies wahrscheinlich daran, dass Sie Folgendes aktivieren müssen mod_rewrite: So aktivieren Sie mod_rewrite für Apache 2.2

Hoffe das hilft. Ich habe einige der häufigsten Probleme genannt, aber es gibt einige andere, die profaner oder einzigartiger sein könnten. Ein weiterer Vorschlag auf einem Dev-Server? Installieren Sie Apache erneut. Wenn möglich, tun Sie dies aus einer anderen Quelle mit einem guten Tutorial.

smcjones
quelle
Toller Haken für Apache2-Konfigurationseinstellungen, ich vermisse diese Einstellung jedes Mal.
Abhishek
3

Für Laravel 4 & 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 !! :) :)

Abhijeet Navgire
quelle
1

Laravel wird bereits mit einer hübschen URL geliefert .htaccess ... Sie sollten sofort einsatzbereit sein ... http://laravel.com/docs/installation#pretty-urls

Stellen Sie sicher, dass mod_rewrite aktiviert ist und dass Ihr Home-Pfad auf das öffentliche Verzeichnis Ihrer Anwendung festgelegt ist.

Kisuka
quelle
Ich habe aktiviert mod_rewriteund den Code kopiert, der auf dieser Seite und immer noch ohne Werke ist
TuGordoBello
1
Stellen Sie sicher, dass Ihr Pfad in Apache auf den öffentlichen Ordner Ihrer Anwendung festgelegt ist.
Kisuka
ServerAdmin webmaster@localhost DocumentRoot /home/web-apps/myproject/public
TuGordoBello
Haben Sie Apache nach dem Aktivieren von mod_rewrite neu gestartet?
Kisuka
Ich habe einen Ordner namens userist der Ort, an dem ich Fotos aufbewahre, auch ich habe eine Blade-Datei namens user, wenn ich in die URL schreibe, myproject.com/userzeigt mir der Inhalt des Ordners, die Bilder
TuGordoBello
1

Dazu müssen Sie die folgenden Schritte ausführen:

  • Ordnen Sie Ihre Domain dem öffentlichen Ordner Ihres Projekts zu (z. B. / var / www / html / yourproject / public) (wenn Sie Linux verwenden).

  • Gehen Sie zu Ihrem öffentlichen Ordner und bearbeiten Sie Ihre .htaccessDatei dort

AddHandler application/x-httpd-php72 .php
<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 non-www to www
    RewriteCond %{HTTP_HOST} !^www\.
    RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

    # Redirect non-http to https
    RewriteCond %{HTTPS} off
    RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

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

    # Remove index.php
    RewriteCond %{THE_REQUEST} ^GET.*index\.php [NC]
    RewriteRule (.*?)index\.php/*(.*) /$1$2 [R=301,NE,L]
</IfModule>

  • Die letzten drei Regeln gelten für den Fall, dass Sie direkt auf eine Route zugreifen, ohne httpsdiese zu schützen.
Shahrukh Anwar
quelle
1

Stellen Sie außerdem sicher, dass Rewrite Engline nach dem Bearbeiten der .htaccess-Datei aktiviert ist

sudo a2enmod rewrite
Rafik Bari
quelle
0
 RewriteEngine on

 RewriteCond %{REQUEST_FILENAME} !-f
 RewriteCond %{REQUEST_FILENAME} !-d

 RewriteRule ^(.*)$ index.php/$1 [L]

Verwenden Sie dies in .htaccess und starten Sie den Server neu

Arun
quelle
0

Hoffe das hilft wie bei mir.

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_URI} !^public
RewriteRule ^(.*)$ public/$1 [L]
</IfModule>
Harry Bosh
quelle
0

Ich habe gerade Laravel 5 für ein Projekt installiert und im Stammverzeichnis befindet sich eine Datei namens server.php.

Ändern Sie es in index.phpund es funktioniert oder geben Sie Terminal ein:

$cp server.php index.php
Samuel Kwame Antwi
quelle
0

Benennen server.phpSie index.phpdie .htaccessDatei in Ihrem Laravel-Stammordner um und kopieren Sie die Datei aus dem /publicVerzeichnis in Ihren Laravel-Stammordner.

Rizwan Taj
quelle
0

Wenn Sie IIS Windows Server verwenden, fügen Sie eine web.configDatei im Stammordner hinzu und geben Sie den folgenden Code ein:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="Imported Rule 1" stopProcessing="true">
                    <match url="^(.*)$" ignoreCase="false" />
                    <conditions logicalGrouping="MatchAll">
                        <add input="{URL}" pattern="^system.*" ignoreCase="false" />
                    </conditions>
                    <action type="Rewrite" url="/index.php/{R:1}" />
                </rule>
                <rule name="Imported Rule 2" stopProcessing="true">
                    <match url="^(.*)$" ignoreCase="false" />
                    <conditions logicalGrouping="MatchAll">
                        <add input="{REQUEST_FILENAME}" matchType="IsFile" ignoreCase="false" negate="true" />
                        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" ignoreCase="false" negate="true" />
                        <add input="{R:1}" pattern="^(index\.php|images|robots\.txt|css)" ignoreCase="false" negate="true" />
                    </conditions>
                    <action type="Rewrite" url="index.php/{R:1}" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>

und wenn Sie verwenden, .htaccess verwenden Sie diese:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
Abd Abughazaleh
quelle
-3
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(.*)/(public)/(index.php)/$ $1/$4 [L]
</IfModule>
Online-Website
quelle
3
Bietet eine weitere Erklärung für Ihre Lösung
Naruto
-3

Gemäß Laravel 5.3 die oben genannten Dinge nicht richtig funktionieren, aber bitte wie folgt vor , ruhig und folgen Sie sein:

Schritt 1. Gehen Sie in das Laravel-Projekt.
Schritt 2. Erstellen Sie ein zufälliges Verzeichnis / Ordner, z. laravelcode
Schritt 3. Verschieben Sie alle Ordner und Dateien (außer öffentlichen Ordner).
Schritt 4. Verschieben Sie alle Ordner und Dateien, die sich im öffentlichen Ordner befinden, in das laravel-Projekt.
Schritt 5. Nun befindet sich im laravel-Projekt bitte die Datei index.php Öffnen Sie das und ändern Sie die Ordnerpfade für Bootstrap gemäß dem neuen Pfad wie zuvor " DIR erforderlich . '/ .. / bootstrap / autoload.php';" Jetzt wird es " DIR erfordern . '/ laravelcode / bootstrap / autoload.php';"

Das heißt, es läuft einfach Ihre URL ohne public und index.php wie unten http: // localhost / blog /

amar nath jena
quelle