Bagaimana cara menghapus "public / index.php" di URL yang Dihasilkan Laravel?


90

Saya perlu menghapus index.phpatau public/index.phpdari URL yang dihasilkan di Laravel; Biasanya jalan adalah localhost/public/index.php/someWordForRoute, Seharusnya sepertilocalhost/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',

Bagaimana saya bisa mengubahnya?


7
URL cantik di Laravel . Pastikan mod_rewritediaktifkan.
Kryten


@Kryten tidak bekerja = /
TuGordoBello

2
Ini adalah solusi ketika solusi lain tidak berfungsi dev-metal.com/enable-mod_rewrite-ubuntu-14-04-lts
TuGordoBello

Apakah dokumen Anda berakar pada folder yang dituju, yaitu/var/www/project_name/public
Kiee

Jawaban:


129

Opsi 1: Gunakan .htaccess

Jika belum ada, buat file .htaccess di direktori root Laravel. Buat .htaccessfile direktori root Laravel Anda jika belum ada. (Biasanya itu ada di bawah public_htmlfolder Anda )

Edit file .htaccess sehingga berisi kode berikut:

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

Sekarang Anda seharusnya bisa mengakses situs web tanpa bagian "/public/index.php/".

Opsi 2: Pindahkan sesuatu di direktori '/ public' ke direktori root

Buat folder baru di direktori root Anda dan pindahkan semua file dan folder kecuali folder publik. Anda bisa menyebutnya apapun yang Anda inginkan. Saya akan menggunakan "laravel_code".

Selanjutnya, pindahkan semuanya dari direktori publik dan ke folder root. Ini akan menghasilkan sesuatu yang agak mirip dengan ini: masukkan deskripsi gambar di sini

Setelah itu, yang harus kita lakukan adalah mengedit lokasi di laravel_code/bootstrap/paths.phpfile dan index.phpfile.

Di laravel_code/bootstrap/paths.phptemukan baris kode berikut:

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

Dan ubah menjadi:

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

Di index.php, temukan baris ini:

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

Dan ubah menjadi:

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

Sumber: Cara menghapus / publik / dari URL di Laravel


5
Jika Anda menggunakan Debian Linux, jangan lupa untuk mengedit etc/apache2/apache2.confperubahan dari AllowOverride Noneke AllowOverride Alltempat Anda melihat konfigurasi Direktori <Directory /var/www/></Directory>,.
Robin Hood

1
Saya hanya perlu memiliki file .htaccess ke direktori root saya untuk membuatnya berfungsi.
Mário Rodrigues

8
Pindah ke / root bukanlah saran yang baik sama sekali dalam mode produksi! Ada alasan mengapa folder publik ada
toesslab

Untuk memastikan aturan penulisan ulang berfungsi, periksa apakah konfigurasi <Directory ...konfigurasi apache memiliki AllowOverride All'Sesuatu seperti ini: <Directory "/var/www/html/laravel/public"> Options Indexes FollowSymLinks MultiViews **AllowOverride All** </Directory>
Japheth Ongeri - inkalimeva

Bagaimana jika saya tidak memiliki akses conf di hosting?
Peter

40

Saya mencoba ini di Laravel 4.2

Ubah nama server.phpdi folder root Laravel Anda menjadi index.phpdan salin .htaccessfile dari /publicdirektori ke folder root Laravel Anda.

Saya harap ini berhasil


1
Jika jawaban yang diterima oleh Luazan tidak berhasil maka ini sudah cukup. Meskipun saya akan memastikan untuk mengedit file index.php di folder publik untuk mengarahkan pengguna keluar dari publik jika mereka langsung membuka tautan itu.
Brad Bird

4
File js dan css tidak dimuat lagi dari folder publik
llioor

@ MaHDyfo - mengapa tidak aman? dan bagaimana ?
151291

2
@ 151291 karena file .env dapat diakses oleh semua orang yang mengunjungi situs Anda dengan cara ini. kecuali Anda mengamankan server web Anda untuk menghindari hal ini.
Mahdyfo

17

Jangan bingung dengan opsi lain potongan di bawah yang saya gunakan dan akan berguna juga untuk Anda. Letakkan htacces di bawah ini di root Anda.

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

Buka direktori publik Anda dan letakkan file htaccess lain dengan potongan kode di bawah ini

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

Bekerja... !!!

Laravel Menggunakan di bawah .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]

Bagus: dapatkah Anda memberi tahu saya apa saja pro dan kontra dari metode ini?
Muhammad Ateek

Saya hanya mengedit .htaccess di root (cuplikan pertama Anda) dan itu memperbaikinya untuk saya, terima kasih!
Peird

13

DI SINI ADALAH LANGKAH SEDERHANA UNTUK MENGHAPUS URL PUBLIK DI (Laravel 5)

1: Salin semua file dari folder publik dan tempel di folder root laravel

2: Buka index.php dan ubah

Dari

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

Untuk

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

Dan

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

Untuk

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

Di laravel 4 jalur 2 adalah $app = require_once __DIR__.'/bootstrap/start.php';sebagai ganti$app = require_once __DIR__.'/bootstrap/app.php';/app.php

Hanya itu saja.


Apakah ada komplikasi lain terkait penautan lain dari situs?
Haring10

Itu terlihat seperti solusi yang bagus dan juga sederhana. Tapi sungguh, seperti yang dikatakan Haring10. Apakah ada masalah dengan ini?
Peter

10

1) Periksa apakah mod_rewrite diaktifkan. Buka /etc/apache2/mods-enableddirektori dan lihat apakah rewrite.loadtersedia. Jika tidak, aktifkan menggunakan perintah sudo a2enmod rewrite. Ini akan mengaktifkan modul rewrite. Jika sudah diaktifkan, itu akan menampilkan pesan Module rewrite already enabled.
2) Buat virtual host untuk direktori publik sehingga alih-alih memberikan http://localhost/public/index.phpkami akan dapat menggunakan seperti itu http://example.com/index.php. [maka nama folder publik akan di-hidded]
3) Kemudian buat .htaccess yang akan menyembunyikan index.php dari url Anda yang harus berada di dalam direktori root (folder publik)

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?/$1 [L]

1
Mencoba langkahmu. Belum ada hasil! Saya tidak mengapa ini terjadi!
Mostafiz Rahman

Berikan info log sehingga kami dapat melacak akar masalahnya
Anggrek


bekerja untuk saya. Jangan membuat host virtual langsung membuka folder publik.
cardi777

Terima kasih. Ini berhasil untuk saya, saya mod_rewritedinonaktifkan.
Maubeh

5

Ini kemungkinan besar tidak ada hubungannya dengan Laravel dan segala sesuatu yang berkaitan dengan konfigurasi Apache Anda.

Apakah Anda memiliki akses ke konfigurasi server Apache Anda? Jika demikian, lihat ini, dari dokumen:

Secara umum, Anda sebaiknya hanya menggunakan file .htaccess jika Anda tidak memiliki akses ke file konfigurasi server utama. Misalnya, ada kesalahpahaman umum bahwa otentikasi pengguna harus selalu dilakukan dalam file .htaccess, dan, dalam beberapa tahun terakhir, kesalahpahaman lain bahwa perintah mod_rewrite harus dimasukkan ke dalam file .htaccess. Ini bukan masalahnya. Anda dapat menempatkan konfigurasi otentikasi pengguna di konfigurasi server utama, dan ini sebenarnya adalah cara yang lebih disukai untuk melakukan sesuatu. Demikian juga, perintah mod_rewrite bekerja lebih baik, dalam banyak hal, di konfigurasi server utama.

... Secara umum, penggunaan file .htaccess harus dihindari jika memungkinkan. Konfigurasi apa pun yang Anda pertimbangkan untuk dimasukkan ke dalam file .htaccess, dapat juga dibuat secara efektif di bagian file konfigurasi server utama Anda.

Sumber: Dokumentasi Apache .

Alasan mengapa saya menyebutkan ini terlebih dahulu adalah karena yang terbaik adalah menyingkirkan .htaccesssepenuhnya jika Anda bisa, dan menggunakan Directorytag di dalam VirtualHosttag. Bisa dikatakan, sisa dari ini akan menganggap Anda bertahan dengan .htaccessrute untuk alasan apa pun.

Untuk memecahnya, beberapa hal dapat terjadi:

  1. Saya perhatikan, mungkin tidak ada gunanya, bahwa file Anda dinamai .htaccesdalam pertanyaan Anda. Dugaan saya adalah bahwa ini adalah kesalahan ketik tetapi jika Anda mengabaikannya dan sebenarnya hanya melewatkan detik, ini adalah jenis kesalahan kecil yang akan membuat saya membenturkan kepala ke dinding mencari sesuatu yang lebih menantang .

  2. Server Anda tidak dapat mengizinkan .htaccess. Untuk memeriksanya, buka file konfigurasi Apache Anda. Dalam build Apache modern ini biasanya tidak ada dalam satu file konfigurasi, jadi pastikan Anda menggunakan file yang mengarah ke aplikasi Anda, di mana pun file itu ada. Perubahan

    AllowOverride none
    

    untuk

    AllowOverride all
    

    Sebagai tindak lanjut, dokumen Apache juga merekomendasikan bahwa, untuk tujuan keamanan, Anda tidak melakukan ini untuk setiap folder jika Anda ingin .htaccessmenulis ulang. Sebagai gantinya, lakukan untuk folder yang perlu Anda tambahkan .htaccess.

  3. Apakah Anda sudah mod_rewritemengaktifkannya? Itu bisa menyebabkan masalah. Saya perhatikan Anda memiliki tag di bagian atas <IfModule mod_rewrite.c>. Cobalah mengomentari tag tersebut dan mulai ulang Apache. Jika Anda mendapatkan kesalahan maka itu mungkin karena Anda perlu mengaktifkan mod_rewrite: Cara mengaktifkan mod_rewrite untuk Apache 2.2

Semoga ini membantu. Saya telah menyebutkan beberapa masalah yang paling umum tetapi ada beberapa masalah lain yang mungkin lebih biasa atau unik. Saran lain tentang server dev? Instal ulang Apache. Jika memungkinkan, lakukan dari sumber yang berbeda dengan tutorial yang bagus.


Tangkapan bagus untuk pengaturan konfigurasi apache2, saya merindukan pengaturan ini setiap saat.
Abhishek

4

Untuk Laravel 4 & 5:

  1. Ubah nama server.phpdi folder root Laravel Anda menjadiindex.php
  2. Salin .htaccessfile dari /publicdirektori ke folder root Laravel Anda .

Itu dia !! :)


2

Pastikan juga Rewrite Engline dihidupkan setelah mengedit file .htaccess

sudo a2enmod rewrite

Pengamatan yang baik Saya berada di server baru dan benar-benar harus mengaktifkannya (dan menambahkan bit yang diperlukan dalam konfigurasi apache juga) menggunakan digitalocean.com/community/tutorials/…
cdsaenz

1

Laravel telah dikirimkan dengan URL yang cantik .htaccess sudah ... Anda harus keluar dari kotak ... http://laravel.com/docs/installation#pretty-urls

Pastikan mod_rewrite diaktifkan dan jalur beranda Anda disetel ke direktori publik aplikasi Anda.


Saya mengaktifkan mod_rewritedan saya menyalin kode yang ada di halaman itu dan masih belum berfungsi
TuGordoBello

1
Pastikan di Apache jalur Anda disetel ke folder publik aplikasi Anda.
Kisuka

ServerAdmin webmaster@localhost DocumentRoot /home/web-apps/myproject/public
TuGordoBello

Apakah Anda memulai ulang apache setelah mengaktifkan mod_rewrite?
Kisuka

Saya memiliki folder bernama useradalah tempat saya menyimpan foto, juga saya memiliki file pisau yang disebut user, ketika saya menulis di URL myproject.com/usermenunjukkan kepada saya isi folder, gambar
TuGordoBello

1

Anda harus melakukan langkah-langkah berikut untuk melakukan ini, yaitu sebagai berikut

  • Petakan domain Anda ke folder publik proyek Anda (yaitu / var / www / html / proyekanda / publik) (jika menggunakan linux)

  • Buka folder publik Anda, edit .htaccessfile Anda di sana

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>


  • Tiga aturan terakhir adalah jika Anda langsung mengakses rute mana pun tanpa https, itu melindunginya.

0
 RewriteEngine on

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

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

gunakan ini di .htaccess dan mulai ulang server


0

Semoga ini membantu seperti yang terjadi pada saya.

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

0

Saya baru saja menginstal Laravel 5 untuk sebuah proyek dan ada file di root bernama server.php.

Ubah ke index.phpdan berfungsi atau ketik terminal:

$cp server.php index.php

0

Ubah nama server.phpdi folder root Laravel Anda menjadi index.phpdan salin .htaccessfile dari /publicdirektori ke folder root Laravel Anda.



0

Jika Anda menggunakan IIS Windows Server tambahkan web.configfile di folder root dan masukkan kode di bawah ini:

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

dan jika Anda .htaccess menggunakan yang ini:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]

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

3
Berikan lebih banyak penjelasan untuk solusi Anda
Naruto

-3

Sesuai Laravel 5.3 hal-hal di atas tidak akan berfungsi dengan baik, tapi harap tenang dan ikuti langkah-langkah di bawah ini:

Langkah 1. Masuk ke dalam proyek laravel.
Langkah 2. Buat satu direktori / folder acak misalnya. laravelcode
Langkah 3. Pindahkan semua folder dan file (Kecuali folder publik )
Langkah 4. Pindahkan semua folder dan file yang berada di dalam folder publik ke proyek laravel
Langkah 5. Sekarang di dalam proyek laravel ada file index.php, silahkan buka itu dan ubah jalur folder untuk bootstrap sesuai jalur baru seperti sebelumnya "memerlukan DIR . '/ .. / bootstrap / autoload.php';" sekarang akan menjadi "membutuhkan DIR . '/ laravelcode / bootstrap / autoload.php';"

Itu saja jalankan url Anda tanpa public dan index.php seperti di bawah ini http: // localhost / blog /

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.