Laravel 5 - Hapus Publik dari URL

241

Saya tahu ini adalah pertanyaan yang sangat populer tetapi saya belum dapat menemukan solusi yang berfungsi untuk Laravel 5. Saya telah mencoba bermigrasi dari Codeigniter untuk waktu yang lama, tetapi proses instalasi yang berbelit-belit ini membuat saya tetap kesal.

Saya tidak ingin menjalankan VM, ini hanya terasa canggung ketika beralih antar proyek.

Saya tidak ingin mengatur root dokumen saya ke folder publik, ini juga canggung ketika beralih antar proyek.

Saya sudah mencoba metode .htaccess mod_rewrite

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

Ini hanya memberi saya Laravel NotFoundHttpException di baris compiled.php 7610.

Ketika saya mencoba L4 beberapa waktu lalu, saya menggunakan metode memindahkan isi folder publik ke root. Struktur L5 sangat berbeda dan mengikuti langkah yang sama benar-benar memecah Laravel (server hanya akan mengembalikan halaman kosong).

Apakah ada metode yang layak untuk menghapus 'publik' di lingkungan pengembangan yang:

  1. Bekerja dengan L5
  2. Mengizinkan saya beralih antar proyek dengan mudah (Saya biasanya mengerjakan 2 atau 3 pada satu waktu).

Terima kasih

** Saya menggunakan MAMP dan PHP 5.6.2

pengguna1537360
sumber
1
Struktur folder dalam panduan ini berbeda dengan saya, saya kira dia tidak menggunakan L5? Saya menghilangkan perubahan yang dia buat pada file Bootstrap / Paths, karena tidak ada. Proyek ini tampaknya akan berhasil. Apakah Anda pikir ini baik-baik saja?
user1537360
kesalahan saya izinkan saya menambahkan jawaban untuk L5
kamlesh.bar
tidak ada yang berhasil mencoba sama
kamlesh.bar
1
Tampaknya berfungsi dengan hanya memodifikasi jalur di file index.php, tapi saya baru di Laravel jadi jelas tidak dapat mengomentari apakah ini stabil / aman.
user1537360
Folder / file lain seharusnya berada di bawah root dokumen Anda.
Mike Rockétt

Jawaban:

431

Untuk Laravel 5:

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

Itu dia!

Asfaq Tamim
sumber
105
whatchout karena ini mungkin tidak aman, pastikan tidak ada yang tidak dapat meminta .envfile Anda jika Anda melakukan ini kecuali Anda
setuju
49
Ini tidak akan berhasil jika Anda mereferensikan aset Anda menggunakan jalur relatif dari root yaitu. "/assets/styles.css" dan seterusnya. Saya masih berjuang dengan menemukan cara terbaik untuk menyebarkannya melalui server
Ghazanfar Mir
1
Ini berfungsi ... Tetapi apakah ada konsekuensi / kerugian menggunakan ini? Banyak yang menyarankan pengaturan host virtual, atau menyalin file secara manual, dll ... Apakah ini juga berfungsi dalam produksi?
Bogz
1
@GabLeRoux <Files "log.txt">Order Allow,DenyDeny from all</Files>menyelesaikan masalah yang Anda atasi . Apakah sekarang aman atau ada risiko lain?
Butterfly
1
@Butterflyit tergantung pada konfigurasi server Anda. Di atas hanya akan memblokir log.txt. Pastikan Anda memblokir data sensitif dari publik. Jika Anda menggunakan Laravel dan membaca dokumentasi dengan seksama , webroot Anda akan terlihat seperti project/public. Lihat diskusi stackoverflow ini qa . Atur server web Anda dan coba untuk https://example.com/.envberjaga-jaga. Jika Anda melihat kata sandi Anda, pertimbangkan semua yang dikompromikan dan ubah semua kata sandi.
GabLeRoux
126

Saya telah memecahkan masalah menggunakan 2 jawaban:

  1. Mengganti nama server.php menjadi index.php (tidak ada modifikasi)
  2. Salin .htaccess dari folder publik ke folder root (seperti kata rimon.ekjon di bawah)
  3. Mengubah .htaccess sedikit sebagai berikut untuk statika:

    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]

    Jika ada file statis lain yang diperlukan, cukup tambahkan ekstensi ke daftar yang dinyatakan sebelumnya

ka_lin
sumber
1
halo @KA_lin. Bagaimana cara mencegah seseorang melihat .env seperti so localhost / oap /
.env
8
Hmmm ... cobaRewriteRule ^.env - [F,L,NC]
ka_lin
2
Atau <Files ~ "\.env$"> Order allow,deny Deny from all </Files>
ka_lin
Terima kasih banyak @ka_lin, apakah ada cara untuk menghapus akses melalui / public /? seperti www.yoursite.com berfungsi tetapi www.yoursite.com/public juga berfungsi, apakah mungkin menghapus yang terakhir?
adaba
8
Ini berfungsi tetapi css, js dan gambar tidak dimuat
Chetan Khandla
94

Di Laravel 5.5, buat file .htacess di direktori root Anda dan tempatkan kode berikut: - Tautan Referensi

<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>
Raham
sumber
5
jawaban terbaik! satu-satunya yang berfungsi dalam contoh saya, seharusnya memiliki lebih banyak suara
FiliusBonacci
Terima kasih ini bekerja untuk saya. Tapi saya ingin tahu ada masalah keamanan atau tidak.
rahul singh Chauhan
@rahulsinghChauhan dengan senang hati. Saya tidak tahu tentang masalah keamanan tetapi harus aman.
Raham
2
Apa aturan ini RewriteRule ^ ^$1 [N] lakukan?
gonzo
Ini adalah satu-satunya yang bekerja untuk saya ... terima kasih banyak
Arshad Ameen
87

JANGAN!

ANDA BENAR-BENAR TIDAK HARUS mengganti nama server.phpdi folder root Laravel Anda index.php dan menyalin .htaccessfile dari /publicdirektori ke folder root Laravel Anda !!!

Dengan cara ini setiap orang dapat mengakses beberapa file Anda ( .envmisalnya). Cobalah sendiri. Anda tidak menginginkan itu!


MELAKUKAN

Sebagai gantinya, Anda harus membuat .htaccessfile di root Anda seperti ini:

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

Ini akan secara diam-diam menulis ulang semua URI dasar Anda ke /publicfolder. Bahkan semua Header , misalnya Header Otorisasi HTTP , dan semua parameter URI opsional diam-diam akan diteruskan ke /publicfolder juga.

Itu saja

Harap dicatat ketika menyiapkan proyek Laravel dengan Docker: Anda tidak perlu melakukan ini.

Derk Jan Speelman
sumber
2
Ini bekerja dengan baik dalam produksi tetapi tidak bekerja di lokal, ada saran?
Haritsinh Gohil
2
Ini bekerja dengan sempurna! lokal dan server terima kasih atas bantuan keamanan!
Ghanshyam Nakiya
1
Halo, @DerkJanSpeelman Saya mencoba mengunggah file laravel saya di dalam subfolder di hosting saya seperti: (example.com/projects/laravel/blog) dalam hal ini, pengunjung harus mengunjungi example.com/projects/laravel/blog/ publik, sehingga saya meletakkan file .htaccess dengan kode Anda di root folder blog dan ingin mengarahkan ke folder publik. Tapi itu tidak berhasil. Berikut adalah Galat yang terjadi: URL yang diminta / publik / tidak ditemukan di server ini. Bagaimana saya bisa memecahkan masalah ini ?
Shovon Das
1
Jawaban ini diremehkan. Dipilih untuk Bold dan sorot Jangan. Ini bekerja dengan sangat baik.
Varun Ved
2
Jawaban Sempurna
alnassre
43

Cara mudah untuk menghapus publik dari laravel 5 url. Anda hanya perlu memotong index.php dan .htaccess dari direktori publik dan menempelnya di direktori root, itu saja dan ganti dua baris di index.php sebagai

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

Catatan : Metode di atas hanya untuk pemula karena mereka mungkin menghadapi masalah dalam mengatur virtual host dan Solusi terbaik adalah men-setup virtual host di mesin lokal dan arahkan ke direktori publik proyek.

Muhammad Sadiq
sumber
1
Setelah itu css tidak dimuat, karena semua css ada di depan umum dan publik dihapus dari url
Tn. Tomar
1
Anda dapat meletakkan "publik /" sebelum file js atau css saat memuat, mis. Html :: script ("public / js / ....."); --Tapi solusi terbaik adalah virtual host ...
Muhammad Sadiq
39

@ rimon.ekjon berkata:

Ganti nama server.php di folder root Laravel Anda menjadi index.php dan salin file .htaccess dari / direktori publik ke folder root Laravel Anda. -- Itu dia !! :)

Itu bekerja untuk saya. Tetapi semua file sumber daya di direktori / publik tidak dapat menemukan dan meminta url tidak berfungsi, karena saya menggunakan pembantu aset ().

Saya mengubah fungsi /Illuminate/Foundation/helpers.php/asset () sebagai berikut:

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

Sekarang semuanya bekerja :)

Terima kasih @ rimon.ekjon dan kalian semua.

Miron
sumber
3
Ini bukan cara yang baik untuk menyelesaikan masalah ini, karena Anda mencoba memperbarui di direktori vendor yang bukan praktik yang baik.
Shadman
1
Anda hanya perlu menambahkan RewriteRule ^(.*)$ public/$1 [L]file .htaccess Anda yang telah Anda salin dari direktori publik, dengan menghapus baris iniRewriteRule ^(.*)/$ /$1 [L,R=301]
Shadman
29

Cukup buat file .htaccess di root dan tambahkan baris ini ke sana

<IfModule mod_rewrite.c>
    RewriteEngine On

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

Itu dia!

Kode di atas berfungsi pada folder root public_html. Setelah mengatakan bahwa file inti inti Anda harus berada di dalam folder public_html, jika direktori Anda terlihat seperti public_html / laravelapp / publik dan jika Anda memasukkan kode di atas di dalam laravelapp itu tidak akan berfungsi. Karena itu Anda harus menyalin semua file inti Anda ke public_html dan meletakkan file .htaccess di sana.

Jika Anda ingin menyimpan kode dalam subdirektori maka Anda dapat membuat subdomain maka kode ini juga akan berfungsi untuk itu.

Abhinav Saraswat
sumber
Saya menjawab di bawah sebelum membaca jawaban Anda dan ini harus menjadi jawaban yang diterima. Tidak ada perubahan file: hanya aturan sederhana dan pintar.
Brigo
@Raham apa url Anda saat ini?
Abhinav Saraswat
2
Hanya ingin menambahkan deskripsi singkat di atas pekerjaan tuan-tuan ini. Kode di atas berfungsi pada folder root public_html (saya juga memiliki masalah). Setelah mengatakan bahwa file inti inti Anda harus berada di dalam folder public_html, saya membuat kesalahan bahwa direktori saya terlihat seperti public_html / laravelapp / publik jika Anda meletakkan kode di atas di dalam laravelapp itu tidak akan berfungsi. Karena itu Anda harus menyalin semua file inti Anda ke public_html dan meletakkan file .htaccess di sana. Merujuk ke centOS dan Cpanel hosting untuk laravel.
Deepesh Thapa
Apa salahnya menggunakan metode ini?
Script47
1
Bekerja seperti pesona bagi saya, saya hanya punya cPanel webshost dan tidak bisa mengubah RootDirectory untuk Apache. Terima kasih! paling sederhana dan paling aman. Ini tidak akan memungkinkan untuk melihat konten folder root Anda
Vincent Decaux
27

Buat .htaccessfile di direktori root dan tempatkan kode seperti di bawah ini.

<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>
Pallav Nagar
sumber
1
Saya sangat merekomendasikan solusi ini.
TheLastCodeBender
1
Saya juga merekomendasikan solusi ini
iglesiasedd
Terima kasih banyak. Ini sempurna (y)
Prappo Islam Prince
3
itu berfungsi dengan baik, tetapi masih file .env dapat diakses langsung dari URL.
Manoj Singh
apakah ini solusi yang aman?
Ketua Tim Pemrogram PHP Sr.
23

1) Saya belum menemukan metode kerja untuk memindahkan direktori publik di L5 . Meskipun Anda dapat memodifikasi beberapa hal di bootstrap index.php, tampaknya beberapa fungsi pembantu didasarkan pada asumsi bahwa direktori publik berada di sana. Sejujurnya Anda benar-benar tidak boleh memindahkan direktori publik.

2) Jika Anda menggunakan MAMP maka Anda harus membuat vhost baru untuk setiap proyek, masing-masing melayani direktori publik proyek tersebut. Setelah dibuat, Anda mengakses setiap proyek dengan nama server yang ditentukan seperti ini:

http://project1.dev
http://project2.dev
Jeremy Schaffer
sumber
15

Mungkin untuk menghapus url publik di laravel5. Ikuti langkah ini:

langkah 1. copy semua file dari publik dan rekatkan pada direktori root

langkah 2. buka index.phpfile ganti dengan

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

Dan hapus semua cache dan cookie.

piyush patel
sumber
Hai, Saya telah mencoba metode Anda, melakukan langkah-langkah di atas tetapi menunjukkan kesalahan berikut: Peringatan: require_once (D: \ Projects \ laravel / public / index.php): gagal membuka aliran: Tidak ada file atau direktori di D: \ Projects \ laravel \ server.php on line 21 Kesalahan fatal: require_once (): Gagal membuka diperlukan 'D: \ Projects \ laravel / public / index.php' (include_path = '.; C: \ xampp \ php \ PEAR' ) di D: \ Projects \ laravel \ server.php on line 21
Ali Shahzad
Ini bukan jawaban yang sempurna, tetapi ini adalah cara yang tidak aman.
Rohit
11

Katakanlah Anda meletakkan semua file dan direktori lain di folder bernama 'lokal'.

masukkan deskripsi gambar di sini

Buka saja index.php dan temukan dua baris ini:

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

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

dan mengubahnya menjadi ini:

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

$app = require_once __DIR__.'/locale/bootstrap/app.php';
Angelo Joseph Salvador
sumber
11

Berikut ini adalah solusi terbaik dan terpendek yang bekerja untuk saya pada Mei, 2018 untuk Laravel 5.5

  1. cukup potong .htaccessfile Anda dari direktori / publik ke direktori root dan ganti kontennya dengan kode berikut:

    <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. Cukup simpan .htaccessfile dan itu saja.

  3. Ganti nama server.phpfile Anda menjadi index.php. itu semua nikmati!

tony pro
sumber
9

Pendekatan TERBAIK: Saya tidak akan merekomendasikan menghapus publik, sebagai gantinya on local computer create a virtual host point to public directorydan on remote hosting change public to public_html and point your domain to this directory. Alasannya, seluruh kode laravel Anda akan aman karena satu tingkat di bawah ke direktori publik Anda :)

METODE 1:

Saya hanya mengganti nama server.phpmenjadi index.phpdan berfungsi

METODE 2:

Ini bekerja dengan baik untuk semua versi laravel ...

Berikut adalah Struktur Direktori saya,

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

Ikuti langkah-langkah mudah ini

  1. pindahkan semua file dari direktori publik ke root / laravel /
  2. sekarang, tidak perlu direktori publik, jadi secara opsional Anda dapat menghapusnya sekarang
  3. sekarang buka index.php dan lakukan penggantian berikut

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

untuk

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

dan

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

untuk

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

  1. sekarang buka bootstrap / paths.php dan ubah jalur direktori publik:

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

untuk

'publik' => DIR . '/ ..',

dan itu saja, sekarang coba http: // localhost / laravel /

Wasim A.
sumber
Tidak apa-apa untuk semuanya. tetapi perintah artisan tidak berfungsi, hanya itu menunjukkan "Tidak dapat membuka file input: artisan". Apakah ada saran?
Kabir Hossain
Metode ini berhasil, Jika Anda OK untuk mengekspos kredensial database Anda kepada pengguna. localhost / laravel / .env
MasoodUrRehman
8

4 cara terbaik untuk menghapus publik dari URL.

Jika Anda menggunakan trik lain untuk menghapus publik dari URL seperti mengubah nama server.php menjadi index.php dan mengubah ke jalur file inti. Jelas, jangan lakukan itu. Lalu mengapa Laravel tidak memberikan solusi seperti ini karena itu bukan cara yang tepat untuk melakukan itu.

1) Hapus publik dari URL menggunakan htaccess di Laravel

Dengan menambahkan file .htaccess ke root, Anda dapat mengakses situs web tanpa publik

<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) Hapus publik dengan membuat host virtual di lokal Anda

Saya memberikan demo di sini untuk sistem operasi Window. Tetapi saya akan mencoba mendefinisikan langkah agar siapa pun dapat dengan mudah mengikuti langkah itu. Anda juga dapat melakukan riset di google untuk hal yang sama untuk sistem operasi tertentu.

Langkah 1: Buka C: \ Windows \ system32 \ drivers \ etc \ buka file "hosts" dalam mode Administrator.

Langkah 2: Tambahkan kode berikut ke dalamnya. Di sini, saya memberi Anda demo demo nama domain projectname.local, Anda dapat menentukan yang Anda inginkan. Jadikan itu konstan di setiap tempat.

127.0.0.1  projectname.local

Langkah 3: Sekarang pergi ke, C:\xampp\apache\conf\extrauntuk pengguna xampp dan untuk pengguna wamp "C:\wamp\bin\apache\Apache2.4.4\conf\extra"dan buka "httpd-vhosts.conf"file. Sekarang tambahkan kode berikut ke dalamnya.

Catatan: Ubah root Dokumen sesuai proyek Anda juga tambahkan nama domain saat Anda mendefinisikan ke dalam file "host".

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

Langkah 4: Terakhir tetapi langkah penting adalah memulai kembali Xampp atau Wamp Anda dan mengakses url like http://projectname.localdan Laravel Anda akan merespons tanpa URL publik.


3) Hapus publik dengan menjalankan perintah di Laravel

Jika Anda bekerja di lokal maka Anda tidak perlu melakukan apa pun hanya perlu menjalankan perintah berikut dari terminal atau alat baris perintah Anda. Setelah itu, Anda dapat mengakses situs web Anda dengan URL yang disediakan oleh baris perintah.

   > php artisan serve

Jika Anda bersedia untuk menjalankan proyek Anda pada IP tertentu maka Anda perlu menjalankan perintah berikut. Jika Anda bekerja pada LAN maka jika Anda ingin orang lain mengakses situs web Anda dari lokal maka Anda hanya perlu memeriksa alamat IP Anda menggunakan baris perintah dengan menjalankan "ipconfig" setelah menjalankan alamat IP Anda mengikuti perintah.

> php artisan serve --host=192.168.0.177

Jika Anda ingin menjalankan proyek Anda pada IP tertentu dengan port tertentu maka Anda perlu perintah berikut.

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

4) Hapus publik di server yang dihosting atau di cpanel

masukkan deskripsi gambar di sini

Setelah menyelesaikan proyek Anda perlu meng-host proyek di server, maka Anda hanya perlu mengatur root dokumen di domain Anda ke folder publik. Periksa tangkapan layar di bawah ini.

Sesuai tangkapan layar jika Anda tidak memiliki folder proyek ke dalam public_html maka Anda hanya perlu menyetel seperti root dokumen Anda "public_html/public".

Referensi diambil dari sini

Mayank Dudakiya
sumber
1
Keempat cara itu bagus, tetapi saya telah memecahkan masalah saya dengan menggunakan solusi pertama.
Manisha
7

Saya ingin menambahkan ke @Humble Learner dan perhatikan bahwa lokasi yang tepat untuk "memperbaiki" jalur url untuk aset adalah /Illuminate/Routing/UrlGenerator.php/asset ().

Perbarui metode untuk mencocokkan:

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

Ini akan memperbaiki skrip, gaya, dan jalur gambar. Apa pun untuk jalur aset.

Sean Perkins
sumber
6

Untuk pengguna XAMPP untuk menghapus publik dari url tanpa menyentuh sistem file default laravel adalah dengan menetapkan Host Virtual untuk aplikasi Anda untuk melakukan ini hanya ikuti langkah-langkah ini

  1. Buka aplikasi panel kontrol XAMPP dan hentikan Apache. Ketahuilah bahwa mesin Windows yang terlambat mungkin menjalankannya sebagai layanan, jadi centang kotak di sebelah kiri modul Apache.

  2. Arahkan ke C:/xampp/apache/conf/extraatau di mana pun file XAMPP Anda berada.

  3. Buka file bernama httpd-vhosts.conf dengan editor teks.

  4. Sekitar baris 19 temukan # NameVirtualHost *:80dan batalkan komentar atau hapus hash.

  5. Di bagian paling bawah file tempel kode berikut:

<VirtualHost *>
    ServerAdmin [email protected]
    DocumentRoot "C:/xampp/htdocs" # change this line with your htdocs folder
    ServerName localhost
    ServerAlias localhost
    <Directory "C:/xampp/htdocs">
        Options Indexes FollowSymLinks Includes ExecCGI
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>
  1. Sekarang Anda dapat menyalin dan menempelkan kode di atas untuk menambahkan direktori Virtual Host Anda. Misalnya saya sedang mengerjakan situs bernama Eatery Engine sehingga cuplikan berikut akan memungkinkan saya untuk bekerja dengan sub-domain pada pemasangan lokal saya:
<VirtualHost eateryengine.dev>
    ServerAdmin [email protected]
    DocumentRoot "C:/xampp/htdocs/eateryengine" # change this line with your htdocs folder
    ServerName eateryengine.dev
    ServerAlias eateryengine.dev
    <Directory "C:/xampp/htdocs/eateryengine">
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>
  1. Selanjutnya buka file host Windows Anda untuk mengedit HOSTS Anda. file akan berlokasi di C:/Windows/System32/drivers/etc/hosts, di mana host adalah file. Buka dengan notepad.
  2. Cari resolusi nama #localhost ditangani dalam DNS itu sendiri.

127.0.0.1 localhost

resolusi nama localhost ditangani dalam DNS itu sendiri.

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. Mulai ulang Apache dan uji semuanya.

Artikel asli dapat ditemukan di sini

cerah kashyap
sumber
5

Selalu ada alasan untuk memiliki folder publik di pengaturan Laravel, semua barang terkait publik harus ada di dalam folder publik,

Jangan arahkan alamat ip / domain Anda ke folder root Laravel tetapi arahkan ke folder publik. Tidak aman mengarahkan server Ip ke folder root., Karena kecuali Anda menulis batasan .htaccess, seseorang dapat dengan mudah mengakses file lainnya.,

Cukup tulis kondisi penulisan ulang dalam .htaccessfile dan instal modul penulisan ulang dan aktifkan modul penulisan ulang, masalah yang menambah publik di rute akan terpecahkan.

Reiah Paul Sam
sumber
3

Saya tahu bahwa ada banyak solusi untuk masalah ini. Solusi terbaik dan termudah adalah menambahkan file .htaccess di root direktori .

Saya mencoba jawaban yang kami berikan untuk masalah ini namun saya menghadapi beberapa masalah dengan auth: api guard di Laravel.

Inilah solusi yang diperbarui:

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

Buat file .htaccess di direktori root Anda dan tambahkan kode ini. Dan semuanya berjalan dengan baik

CHARITRA SHRESTHA
sumber
2

Laravel 5.5

Setelah menginstal Laravel untuk pertama kalinya, saya menghadapi "masalah folder publik" yang terkenal dan saya menemukan solusi ini yang, menurut pendapat pribadi saya , adalah "lebih bersih" daripada yang lain yang saya temukan di Web.


Prestasi

  • Tidak punya publickata di URI
  • Lindungi .envfile dari orang yang ingin tahu

Semuanya bisa dilakukan hanya dengan mengedit .htaccesspenggunaan mod_rewritedan empat aturan sederhana.


Langkah

  1. Pindahkan .htaccessfile ke public/.htaccessdalam root utama
  2. Edit seperti di bawah ini

Saya berkomentar semuanya, jadi harus jelas (saya harap) juga untuk mereka yang tidak pernah menggunakan mod_rewrite(bukan bahwa saya seorang ahli, sebaliknya). Juga, untuk memahami aturan, harus jelas bahwa, di Laravel, jika Bill terhubung https://example.com, https://example.com/index.phpdimuat. File ini hanya berisi perintah header("refresh: 5; https://example.com/public/"), yang mengirimkan permintaan ke https://example.com/public/index.php. Yang kedua index.phpini bertanggung jawab untuk memuat controller dan hal-hal lain.

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

Aturan berikut (asal dalam public/.htaccess) dapat dihapus. Faktanya, aturan yang sama dijelaskan secara lebih rinci dalam dua aturan terakhir.

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

EDIT: Saya ketinggalan solusi Abhinav Saraswat dan jawabannya harus diterima. Hanya satu, aturan sederhana dan jelas yang mengarahkan semua lalu lintas ke folder publik tanpa memodifikasi file apa pun.

Brigo
sumber
2

Pertama, Anda bisa menggunakan langkah ini

Untuk Laravel 5:

1. Ganti nama server.php di folder root Laravel Anda menjadi index.php

2. Salin file .htaccess dari / direktori publik ke folder root Laravel Anda.

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

setelah Anda mengikuti langkah-langkah ini maka Anda perlu mengubah semua jalur css dan skrip, tetapi ini akan melelahkan.

Proposal Solusi : cukup Anda dapat melakukan sedikit perubahan padahelpers::asset fungsi.

Untuk ini :

  1. Buka vendor\laravel\framework\src\Illuminate\Foundation\helpers.php

  2. goto line 130

  3. tulis "public/".$pathalih-alih $path,

    function asset($path, $secure = null){
       return app('url')->asset("public/".$path, $secure);
    }
Ferhat KOÇER
sumber
2
Aturan nomor 1: Jangan pernah mengedit file inti. Bahkan jika itu terlihat mudah dan baik sekarang, Anda akan membayar nanti.
Janaka Dombawela
@JanakaDombawela saya tidak berpikir seperti itu karena:
Ferhat KOÇER
@JanakaDombawela Saya tidak berpikir seperti itu karena: Senerio 1: Jika pengembang berpengalaman: Kode sumber terbuka untuk pekerjaan ini Senerio 2: Jika pengembang adalah junior, pengembang harus melakukan edit ke kode sumber untuk mendapatkan pengalaman
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>

Aktifkan modul mod_rewrite dengan

sudo a2enmod rewrite

dan restart apache

sudo service apache2 restart

Untuk menggunakan mod_rewrite dari dalam file .htaccess (yang merupakan kasus penggunaan yang sangat umum), edit VirtualHost default dengan

sudo nano /etc/apache2/sites-available/000-default.conf

Di bawah "DocumentRoot / var / www / html" tambahkan baris berikut:

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

Mulai ulang server lagi:

sudo service apache2 restart
mujuonly
sumber
1

Saya telah membaca beberapa artikel sebelumnya dan berfungsi dengan baik tetapi benar-benar tidak tahu aman atau tidak

    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. 

Edit index.php

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

untuk

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

Bahkan jika saya tidak merekomendasikan menempatkan Laravel di folder root ada beberapa kasus ketika itu tidak dapat dihindari; untuk kasus-kasus metode di atas tidak berfungsi untuk aset jadi saya membuat perbaikan cepat mengubah htaccess: setelah menyalin server.php ke index.php edit file .htaccess seperti:

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

Ini adalah perbaikan cepat yang harus saya lakukan sehingga siapa pun boleh meng-upgrade-nya.

Plokko
sumber
1

Masalahnya adalah jika Anda mengetik / publik dan masih akan tersedia di url, karenanya saya membuat perbaikan yang harus ditempatkan di publik / index.php

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

kedamaian kode ini akan menghapus publik dari url dan akan memberikan 404 dan kemudian mengalihkan ke url tanpa publik

Paul De Zwaan
sumber
0

Metode lain yang saya gunakan adalah membuat tautan simbolik (di Linux, tidak tahu tentang Win) menggunakan perintah ln di htdocs atau www yaitu ln projectname/public project Situs ini dapat diakses melalui localhost / proyek

Eli Makumba
sumber
0

Anda dapat menghapus kata kunci publik dari url menggunakan berbagai metode.

1) Jika Anda menggunakan hosting khusus dan Anda memiliki akses root, maka Anda dapat menghapus kata kunci publik dari url menggunakan Virtual Host. Anda harus memberikan jalur DocumentRoot dengan publik. Jadi ini akan memulai indeks dari direktori publik dan menghapusnya dari 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) Jika Anda tidak memiliki akses root hosting Anda maka Anda harus membuat file .htaccess baru di direktori root Anda dan meletakkan kode seperti di bawah ini

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

Anda bisa mendapatkan lebih banyak referensi di sini.

Vinod Joshi
sumber
0

Buat file .htaccess di direktori root dan tempatkan kode seperti di bawah ini.

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

Buat file .htaccess di / direktori publik dan tempatkan kode seperti di bawah ini.

<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>
Ghanshyam Nakiya
sumber
-1

Saya menemukan solusi terbaik untuk masalah ini.

Edit saja .htaccessdi folder root Anda dan tulis kode berikut. Tidak ada lagi yang dibutuhkan

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>
AKHIL RAJ
sumber
-1

Saya telah mencoba beberapa solusi di sini dan menemukan htaccess yang berfungsi untuk laravel 5.2, seperti ini:

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]

ketika Anda memiliki file atau folder lain yang dilarang tambahkan saja

RewriteRule ^your_file - [F,L,NC]
adam
sumber
-1

Anda tidak perlu berbuat banyak, cukup buat file .htaccess pada direktori root dan rekatkan / simpan di bawah ini;

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(.*)$ public/$1 [L]
</IfModule>
Victor Ifeanyi Ejiogu
sumber
Ini mengarahkan saya ke / publik / publik
zanderwar
@zanderwar, tolong apa versi Laravel? Juga, saya harap Anda tidak memiliki proyek Anda pada sub-direktori dari direktori utama?
Victor Ifeanyi Ejiogu
Project adalah root, versinya adalah 5.6. * - Namun ada pada subdomain, pada shared hosting; sayangnya instalasi cPanel ini memaksa subdomain untuk memiliki folder di dalam public_html
zanderwar