Bekerja pada proyek Laravel 5 pertama saya dan tidak yakin di mana atau bagaimana menempatkan logika untuk memaksa HTTPS di aplikasi saya. Penentu di sini adalah bahwa ada banyak domain yang menunjuk ke aplikasi dan hanya dua dari tiga yang menggunakan SSL (yang ketiga adalah domain fallback, cerita panjang). Jadi saya ingin menangani ini dalam logika aplikasi saya daripada .htaccess.
Di Laravel 4.2 saya menyelesaikan pengalihan dengan kode ini, yang terletak di filters.php
:
App::before(function($request)
{
if( ! Request::secure())
{
return Redirect::secure(Request::path());
}
});
Saya berpikir Middleware adalah tempat di mana sesuatu seperti ini harus diimplementasikan tetapi saya tidak dapat memahaminya dengan menggunakannya.
Terima kasih!
MEMPERBARUI
Jika Anda menggunakan Cloudflare seperti saya, ini dilakukan dengan menambahkan Aturan Halaman baru di panel kontrol Anda.
sumber
$_SERVER['HTTP_HOST']
Jawaban:
Anda dapat membuatnya bekerja dengan kelas Middleware. Biarkan saya memberi Anda ide.
Kemudian, terapkan middleware ini ke setiap permintaan yang menambahkan pengaturan aturan pada
Kernel.php
file, seperti:Pada contoh di atas, middleware akan mengarahkan setiap permintaan ke https jika:
production
. Jadi, sesuaikan saja pengaturannya sesuai dengan preferensi Anda.Cloudflare
Saya menggunakan kode ini di lingkungan produksi dengan WildCard SSL dan kode bekerja dengan benar. Jika saya menghapus
&& App::environment() === 'production'
dan mengujinya di localhost, pengalihan juga berfungsi. Jadi, menginstal atau tidak SSL bukanlah masalahnya. Sepertinya Anda perlu sangat memperhatikan lapisan Cloudflare Anda agar dapat dialihkan ke protokol Https.Edit 23/03/2015
Terima kasih
@Adam Link
atas saran: kemungkinan besar disebabkan oleh header yang dilewati Cloudflare. CloudFlare kemungkinan besar menyerang server Anda melalui HTTP dan meneruskan header X-Forwarded-Proto yang menyatakan itu meneruskan permintaan HTTPS. Anda perlu menambahkan baris lain di Middleware yang bertuliskan ...... untuk mempercayai header yang dikirim CloudFlare. Ini akan menghentikan loop pengalihan
Sunting 27/09/2016 - Laravel v5.3
Hanya perlu menambahkan kelas middleware ke dalam
web
grup dikernel.php file
:Sunting 23/08/2018 - Laravel v5.7
App::environment() === 'production'
. Untuk versi sebelumnya adalahenv('APP_ENV') === 'production'
.\URL::forceScheme('https');
sebenarnya tidak mengalihkan. Itu hanya membangun tautanhttps://
setelah situs web dirender.sumber
$request->setTrustedProxies( [ $request->getClientIp() ] );
untuk mempercayai header yang dikirim CloudFlare. Ini akan menghentikan loop pengalihan.return redirect()->secure($request->getRequestUri(), 301);
$request->server('HTTP_X_FORWARDED_PROTO') != 'https'
ini berfungsi untuk sayaOpsi lain yang berfungsi untuk saya, di AppServiceProvider tempatkan kode ini di metode boot:
Fungsi yang ditulis sebelum forceSchema ('https') salah, forceScheme-nya
sumber
\URL::forceScheme('https');
if($this->app->environment() === 'production'){ $this->app['request']->server->set('HTTPS', true); }
\URL::forceScheme('https')
Atau, Jika Anda menggunakan Apache, Anda dapat menggunakan
.htaccess
file untuk memaksa URL Anda menggunakanhttps
awalan. Pada Laravel 5.4, saya menambahkan baris berikut ke.htaccess
file saya dan itu berhasil untuk saya.sumber
RewriteCond %{HTTP_HOST} !=localhost
di dev untuk menyiasati ini.untuk laravel 5.4 gunakan format ini untuk mendapatkan pengalihan https, bukan .htaccess
sumber
Mirip dengan jawaban manix tetapi di satu tempat. Middleware untuk memaksa HTTPS
sumber
Ini untuk Larave 5.2.x dan yang lebih baru. Jika Anda ingin memiliki opsi untuk menyajikan beberapa konten melalui HTTPS dan lainnya melalui HTTP, berikut adalah solusi yang berhasil untuk saya. Anda mungkin bertanya-tanya, mengapa seseorang hanya ingin menyajikan beberapa konten melalui HTTPS? Mengapa tidak menyajikan semuanya melalui HTTPS?
Meskipun, tidak masalah untuk menyajikan seluruh situs melalui HTTPS, memutuskan semuanya melalui HTTPS memiliki biaya tambahan di server Anda. Ingat enkripsi tidak murah. Overhead kecil juga berdampak pada waktu respons aplikasi Anda. Anda dapat berargumen bahwa perangkat keras komoditas itu murah dan dampaknya dapat diabaikan tetapi saya ngelantur :) Saya tidak suka ide menyajikan konten pemasaran halaman besar dengan gambar dll melalui https. Jadi begini. Ini mirip dengan apa yang orang lain sarankan di atas menggunakan middleware tetapi ini adalah solusi lengkap yang memungkinkan Anda untuk beralih antara HTTP / HTTPS.
Pertama buat middleware.
Seperti inilah middleware Anda seharusnya.
Perhatikan bahwa saya tidak memfilter berdasarkan lingkungan karena saya memiliki pengaturan HTTPS untuk pengembang lokal dan produksi sehingga tidak perlu.
Tambahkan yang berikut ini ke routeMiddleware \ App \ Http \ Kernel.php Anda sehingga Anda dapat memilih dan memilih grup rute mana yang harus memaksa SSL.
Selanjutnya, saya ingin mengamankan dua grup dasar login / signup dll dan yang lainnya di belakang middleware Auth.
Konfirmasikan bahwa middlewares Anda diterapkan ke rute Anda dengan benar dari konsol.
Sekarang Anda telah mengamankan semua formulir atau area sensitif aplikasi Anda, kuncinya sekarang adalah menggunakan templat tampilan Anda untuk menentukan tautan aman dan publik (non https).
Berdasarkan contoh di atas, Anda akan membuat tautan aman Anda sebagai berikut -
Tautan tidak aman dapat dirender sebagai
Apa yang dilakukannya adalah merender URL yang sepenuhnya memenuhi syarat seperti https: // yourhost / login dan http: // yourhost / aboutus
Jika Anda tidak merender URL yang sepenuhnya memenuhi syarat dengan http dan menggunakan url tautan relatif ('/ aboutus'), https akan tetap ada setelah pengguna mengunjungi situs yang aman.
Semoga ini membantu!
sumber
Bagaimana dengan hanya menggunakan file .htaccess untuk mencapai https redirect? Ini harus ditempatkan di root proyek (bukan di folder publik). Server Anda perlu dikonfigurasi untuk mengarah ke direktori akar proyek.
Saya menggunakan ini untuk laravel 5.4 (versi terbaru saat menulis jawaban ini) tetapi itu harus terus berfungsi untuk versi fitur bahkan jika laravel mengubah atau menghapus beberapa fungsionalitas.
sumber
RewriteCond %{HTTP_HOST} productiondomain\.com$ [NC]
Anda dapat menggunakan RewriteRule untuk memaksa ssl di .htaccess folder yang sama dengan index.php Anda.
Silakan tambahkan sebagai gambar lampirkan, tambahkan sebelum semua aturan yang lain
sumber
di IndexController.php letakkan
di AppServiceProvider.php put
}
Di AppServiceProvider.php setiap redirect akan masuk ke url https dan untuk request http kita perlu sekali redirect jadi di IndexController.php cukup kita lakukan sekali redirect
sumber
Jawaban di atas tidak berhasil untuk saya, tetapi tampaknya Deniz Turan menulis ulang .htaccess dengan cara yang berfungsi dengan load balancer Heroku di sini: https://www.jcore.com/2017/01/29/force-https -on-heroku-menggunakan-htaccess /
sumber
Saya menambahkan alternatif ini karena saya sangat menderita dengan masalah ini. Saya mencoba semua cara berbeda dan tidak ada yang berhasil. Jadi, saya menemukan solusi untuk itu. Ini mungkin bukan solusi terbaik tetapi berhasil -
produksi <- Ini harus diganti dengan nilai APP_ENV di file .env Anda
sumber
Berikut cara melakukannya di Heroku
Untuk memaksa SSL pada dynos Anda tetapi tidak secara lokal, tambahkan ke akhir .htaccess Anda di publik /:
Anda dapat mengujinya di komputer lokal Anda dengan:
Itu mengatur header X-diteruskan ke bentuk yang akan diambilnya di heroku.
yaitu mensimulasikan bagaimana seorang heroku dyno akan melihat permintaan.
Anda akan mendapatkan respons ini di komputer lokal Anda:
Itu adalah pengalihan. Itulah yang akan diberikan oleh heroku kepada klien jika Anda menyetel .htaccess seperti di atas. Tetapi itu tidak terjadi di komputer lokal Anda karena X-forwarded tidak akan disetel (kami memalsukannya dengan curl di atas untuk melihat apa yang terjadi).
sumber
Jika Anda menggunakan CloudFlare, Anda dapat membuat Aturan Halaman untuk selalu menggunakan HTTPS: Ini akan mengarahkan setiap http: // permintaan ke https: //
Selain itu, Anda juga harus menambahkan sesuatu seperti ini ke fungsi \ app \ Providers \ AppServiceProvider.php boot ():
Ini akan memastikan bahwa setiap tautan / jalur di aplikasi Anda menggunakan https: //, bukan http: //.
sumber
Pendekatan yang sedikit berbeda, diuji di Laravel 5.7
PS. Kode diperbarui berdasarkan komentar @ matthias-lill.
sumber
config('app.url')
. Selain itu, Laravel hadir dengan fungsi string yang sangat bergunaStr::startsWith(config('app.url'), 'https://')
.Untuk Laravel 5.6, saya harus sedikit mengubah kondisi agar berfungsi.
dari:
Untuk:
sumber
Ini berhasil bagi saya. Saya membuat kode php khusus untuk memaksa mengarahkannya ke https. Cukup sertakan kode ini di header.php
sumber
Saya menggunakan middleware Laravel 5.6.28 berikutnya:
sumber
Cara termudah adalah di level aplikasi. Di dalam file
tambahkan yang berikut ini:
dan dalam metode boot () tambahkan yang berikut ini:
Ini harus mengarahkan semua permintaan ke https di tingkat aplikasi.
(Catatan: ini telah diuji dengan laravel 5.5 LTS)
sumber
Anda dapat dengan mudah pergi ke app -> Providers -> AppServiceProvider.php
tambahkan dua baris
gunakan Illuminate \ Support \ Facades \ URL;
URL :: forceScheme ('https');
seperti yang ditunjukkan pada kode berikut:
sumber
Ini berfungsi untuk saya di Laravel 7.x dalam 3 langkah sederhana menggunakan middleware:
1) Buat middleware dengan perintah
php artisan make:middleware ForceSSL
Middleware
2) Daftarkan middleware di
routeMiddleware
dalam file KernelInti
3) Gunakan di rute Anda
Rute
di sini dokumentasi lengkap tentang middlewares
========================
Metode .HTACCESS
Jika Anda lebih suka menggunakan
.htaccess
file, Anda dapat menggunakan kode berikut:Salam!
sumber