Laravel 5 - chuyển hướng đến HTTPS


127

Làm việc trên dự án Laravel 5 đầu tiên của tôi và không chắc chắn về vị trí hoặc cách đặt logic để buộc HTTPS trên ứng dụng của tôi. Mấu chốt ở đây là có nhiều miền trỏ đến ứng dụng và chỉ có 2/3 sử dụng SSL (miền thứ 3 là miền dự phòng, một câu chuyện dài). Vì vậy, tôi muốn xử lý điều này theo logic ứng dụng của mình hơn là .htaccess.

Trong Laravel 4.2, tôi đã hoàn thành việc chuyển hướng với mã này, nằm trong filters.php:

App::before(function($request)
{
    if( ! Request::secure())
    {
        return Redirect::secure(Request::path());
    }
});

Tôi đang nghĩ Middleware là nơi mà một cái gì đó như thế này nên được triển khai nhưng tôi không thể hiểu được điều này bằng cách sử dụng nó.

Cảm ơn!

CẬP NHẬT

Nếu bạn đang sử dụng Cloudflare như tôi, điều này được thực hiện bằng cách thêm Quy tắc trang mới trong bảng điều khiển của bạn.


Vậy điều gì xảy ra với miền thứ 3? Nếu bạn buộc https trên tất cả các tuyến - miền thứ 3 có tiếp tục hoạt động không?
Laurence

Phát hiện điều đó với$_SERVER['HTTP_HOST']
NightMICU

Mất bao lâu để quy tắc trang cloudflare có hiệu lực
CodeGuru

Ồ, tôi phải bật proxy trong cài đặt DNS haha!
CodeGuru

Câu trả lời:


253

Bạn có thể làm cho nó hoạt động với lớp Middleware. Hãy để tôi cho bạn một ý tưởng.

namespace MyApp\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\App;

class HttpsProtocol {

    public function handle($request, Closure $next)
    {
            if (!$request->secure() && App::environment() === 'production') {
                return redirect()->secure($request->getRequestUri());
            }

            return $next($request); 
    }
}

Sau đó, áp dụng phần mềm trung gian này cho mọi yêu cầu thêm thiết lập quy tắc tại Kernel.phptệp, như sau:

protected $middleware = [
    'Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode',
    'Illuminate\Cookie\Middleware\EncryptCookies',
    'Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse',
    'Illuminate\Session\Middleware\StartSession',
    'Illuminate\View\Middleware\ShareErrorsFromSession',

    // appending custom middleware 
    'MyApp\Http\Middleware\HttpsProtocol'       

];

Ở ví dụ trên, phần mềm trung gian sẽ chuyển hướng mọi yêu cầu đến https nếu:

  1. Yêu cầu hiện tại không có giao thức an toàn (http)
  2. Nếu môi trường của bạn bằng production. Vì vậy, chỉ cần điều chỉnh cài đặt theo sở thích của bạn.

Cloudflare

Tôi đang sử dụng mã này trong môi trường sản xuất với SSL WildCard và mã hoạt động chính xác. Nếu tôi gỡ bỏ && App::environment() === 'production'và kiểm tra nó trong localhost, chuyển hướng cũng hoạt động. Vì vậy, có hay không cài đặt SSL không phải là vấn đề. Có vẻ như bạn cần phải chú ý đến lớp Cloudflare của mình để được chuyển hướng đến giao thức Https.

Chỉnh sửa 23/03/2015

Cảm ơn @Adam Linkgợi ý của: có thể là do các tiêu đề mà Cloudflare đang chuyển qua. CloudFlare có thể truy cập máy chủ của bạn qua HTTP và chuyển một tiêu đề X-Forwarded-Proto tuyên bố rằng nó đang chuyển tiếp một yêu cầu HTTPS. Bạn cần thêm một dòng khác trong Phần mềm trung gian của mình nói rằng ...

$request->setTrustedProxies( [ $request->getClientIp() ] ); 

... để tin tưởng các tiêu đề mà CloudFlare đang gửi. Điều này sẽ dừng vòng lặp chuyển hướng

Chỉnh sửa 27/09/2016 - Laravel v5.3

Chỉ cần thêm lớp phần mềm trung gian vào webnhóm trong kernel.php file:

protected $middlewareGroups = [
    'web' => [
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,

        // here
        \MyApp\Http\Middleware\HttpsProtocol::class

    ],
];

Hãy nhớ rằng webnhóm được áp dụng cho mọi tuyến đường theo mặc định, vì vậy bạn không cần phải đặt webrõ ràng trong các tuyến đường cũng như bộ điều khiển.

Chỉnh sửa 23/08/2018 - Laravel v5.7

  • Để chuyển hướng một yêu cầu tùy thuộc vào môi trường bạn có thể sử dụng App::environment() === 'production'. Đối với phiên bản trước là env('APP_ENV') === 'production'.
  • Sử dụng \URL::forceScheme('https');thực sự không chuyển hướng. Nó chỉ xây dựng các liên kết https://khi trang web được hiển thị.

5
Điều này dường như mang lại cho tôi một vòng lặp chuyển hướng ... có vẻ như nó sẽ hoạt động. Tôi không biết liệu nó có tạo ra sự khác biệt nào không nhưng chúng tôi đang sử dụng Cloudflare SSL. Nhưng tôi không nghĩ rằng điều đó sẽ thay đổi chuyển hướng đơn giản.
NightMICU

3
@NightMICU Tôi không chắc liệu bạn đã giải quyết được sự cố với chuyển hướng chưa, nhưng có thể do tiêu đề mà Cloudflare chuyển qua gây ra. CloudFlare có thể truy cập máy chủ của bạn qua HTTP và chuyển một tiêu đề X-Forwarded-Proto tuyên bố rằng nó đang chuyển tiếp một yêu cầu HTTPS. Bạn cần thêm một dòng khác trong Phần mềm trung gian của mình nói rằng $request->setTrustedProxies( [ $request->getClientIp() ] );hãy tin tưởng các tiêu đề mà CloudFlare đang gửi. Điều này sẽ dừng vòng lặp chuyển hướng.
Adam Link

2
@manix Tuyệt vời. Tôi vừa giải quyết vấn đề HTTPS vào cuối tuần này với dự án của riêng tôi - những thứ nhỏ nhặt đó sẽ khiến bạn thất vọng trong nhiều giờ!
Adam Link

8
Câu trả lời xuất sắc! Chỉ một chi tiết: Tốt hơn là sử dụng chuyển hướng 301 để cho Google biết đó là một chuyển động vĩnh viễn. Như:return redirect()->secure($request->getRequestUri(), 301);
adriaroca

4
đối với những người dưới trình cân bằng tải hoặc proxy có thể thay đổi thành bảo mật () để $request->server('HTTP_X_FORWARDED_PROTO') != 'https'điều này hoạt động đối với tôi
Shiro

63

Một tùy chọn khác phù hợp với tôi, trong AppServiceProvider, hãy đặt mã này vào phương thức khởi động:

\URL::forceScheme('https');

Hàm được viết trước forceSchema ('https') là sai, forceScheme của nó


16
Này, chỉ tìm thấy điều này thông qua googling xung quanh - lưu ý rằng vào ngày 5.4 là\URL::forceScheme('https');
dev

5
Trong cùng một tệp, bạn cũng có thể làmif($this->app->environment() === 'production'){ $this->app['request']->server->set('HTTPS', true); }
Rory

2
u ấy có ý\URL::forceScheme('https')
Ernest Okot

17
Tôi khá chắc rằng điều này chỉ để xây dựng liên kết. Điều này sẽ không buộc người dùng phải https, nó sẽ chỉ cung cấp các liên kết được thêm vào trước bằng https: //
Weston Watson

vâng, nó đã xảy ra @WestonWatson. vui lòng share giải pháp nếu tìm thấy
Harat

33

Ngoài ra, nếu bạn đang sử dụng Apache thì bạn có thể sử dụng .htaccesstệp để thực thi các URL của mình sử dụng httpstiền tố. Trên Laravel 5.4, tôi đã thêm các dòng sau vào .htaccesstệp của mình và nó hoạt động với tôi.

RewriteEngine On

RewriteCond %{HTTPS} !on
RewriteRule ^.*$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

2
Điều này không tốt nếu bạn có nhiều môi trường (nhà phát triển, giai đoạn, sản xuất) hơn bạn cần đặt SSL trên tất cả chúng.
Mladen Janjetovic

@MladenJanjetovic bạn có thể sử dụng RewriteCond %{HTTP_HOST} !=localhosttrên nhà phát triển để giải quyết vấn đề này.
Dan

3
@Dan - Có, nhưng bạn vẫn sẽ phải thiết lập nó cho giai đoạn, cục bộ (và điều này phức tạp hơn nếu các nhà phát triển đang sử dụng các URL khác nhau trong phát triển cục bộ, tức là .dev, .local, tên miền phụ, ... vv). Tôi muốn có loại logic đó trong ứng dụng.
Mladen Janjetovic

16

cho laravel 5.4 sử dụng định dạng này để nhận chuyển hướng https thay vì .htaccess

namespace App\Providers;

use Illuminate\Support\Facades\URL;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    public function boot()
    {
        URL::forceScheme('https');
    }
}

15
Chỉ cần làm rõ: 1) những thay đổi này nên được thực hiện trong app / Providers / AppServiceProvider.php; 2) điều này chỉ để đặt các liên kết được tạo bên trong ứng dụng để sử dụng SSL, nó không bắt buộc bạn phải sử dụng SSL
Phoenix

Hi, Route không tạo ra bằng phương pháp này nếu tôi bấm vào một nút mà gửi cho tôi để con đường tiếp theo của nó không đem lại cho tôi những lỗi 404
Saket Sinha

Đây không phải là chuyển hướng https. Nhưng nó cho phép phân phát trang web https: //. Nếu bạn thay đổi nó thành http: //, nó cũng sẽ hoạt động.
franc

12

Tương tự như câu trả lời của manix nhưng ở một nơi. Phần mềm trung gian để buộc HTTPS

namespace App\Http\Middleware;

use Closure;

use Illuminate\Http\Request;

class ForceHttps
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request $request
     * @param  \Closure $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if (!app()->environment('local')) {
            // for Proxies
            Request::setTrustedProxies([$request->getClientIp()]);

            if (!$request->isSecure()) {
                return redirect()->secure($request->getRequestUri());
            }
        }

        return $next($request);
    }
}

Yêu cầu có cần phải tĩnh không?
GFxJamal

@jRhesk nó có lẽ không, nhưng hãy thử và cảm thấy tự do để thay đổi câu trả lời
Mladen Janjetovic

8

Điều này dành cho Larave 5.2.x và lớn hơn. Nếu bạn muốn có tùy chọn để phân phát một số nội dung qua HTTPS và những nội dung khác qua HTTP thì đây là một giải pháp phù hợp với tôi. Bạn có thể tự hỏi, tại sao ai đó lại muốn chỉ phân phát một số nội dung qua HTTPS? Tại sao không phân phối mọi thứ qua HTTPS?

Mặc dù, việc phân phát toàn bộ trang web qua HTTPS là hoàn toàn ổn, việc cắt đứt mọi thứ qua HTTPS sẽ có thêm chi phí trên máy chủ của bạn. Hãy nhớ rằng tiền mã hóa không hề rẻ. Chi phí nhỏ cũng có tác động đến thời gian phản hồi ứng dụng của bạn. Bạn có thể tranh luận rằng phần cứng hàng hóa rẻ và tác động là không đáng kể nhưng tôi lạc đề :) Tôi không thích ý tưởng phục vụ nội dung tiếp thị trên các trang lớn với hình ảnh, v.v. trên https. Vì vậy, đây là nó đi. Nó tương tự như những gì những người khác đã đề xuất ở trên bằng cách sử dụng phần mềm trung gian nhưng đó là một giải pháp đầy đủ cho phép bạn chuyển đổi qua lại giữa HTTP / HTTPS.

Đầu tiên tạo một phần mềm trung gian.

php artisan make:middleware ForceSSL

Đây là những gì phần mềm trung gian của bạn sẽ trông như thế nào.

<?php

namespace App\Http\Middleware;

use Closure;

class ForceSSL
{

    public function handle($request, Closure $next)
    {

        if (!$request->secure()) {
            return redirect()->secure($request->getRequestUri());
        }

        return $next($request);
    }
}

Lưu ý rằng tôi không lọc dựa trên môi trường vì tôi đã thiết lập HTTPS cho cả nhà phát triển cục bộ và sản xuất nên không cần thiết.

Thêm phần sau vào routeMiddleware \ App \ Http \ Kernel.php của bạn để bạn có thể chọn và chọn nhóm định tuyến nào sẽ buộc SSL.

    protected $routeMiddleware = [
    'auth' => \App\Http\Middleware\Authenticate::class,
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    'can' => \Illuminate\Foundation\Http\Middleware\Authorize::class,
    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
    'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
    'forceSSL' => \App\Http\Middleware\ForceSSL::class,
];

Tiếp theo, tôi muốn bảo mật hai nhóm cơ bản đăng nhập / đăng ký, v.v. và mọi thứ khác đằng sau phần mềm trung gian Auth.

Route::group(array('middleware' => 'forceSSL'), function() {
/*user auth*/
Route::get('login', 'AuthController@showLogin');
Route::post('login', 'AuthController@doLogin');

// Password reset routes...
Route::get('password/reset/{token}', 'Auth\PasswordController@getReset');
Route::post('password/reset', 'Auth\PasswordController@postReset');

//other routes like signup etc

});


Route::group(['middleware' => ['auth','forceSSL']], function()
 {
Route::get('dashboard', function(){
    return view('app.dashboard');
});
Route::get('logout', 'AuthController@doLogout');

//other routes for your application
});

Xác nhận rằng phần mềm trung gian của bạn được áp dụng đúng cách cho các tuyến đường của bạn từ bảng điều khiển.

php artisan route:list

Bây giờ bạn đã bảo mật tất cả các biểu mẫu hoặc khu vực nhạy cảm trong ứng dụng của mình, chìa khóa bây giờ là sử dụng mẫu chế độ xem của bạn để xác định các liên kết bảo mật và công khai (không phải https) của bạn.

Dựa trên ví dụ trên, bạn sẽ hiển thị các liên kết an toàn của mình như sau:

<a href="{{secure_url('/login')}}">Login</a>
<a href="{{secure_url('/signup')}}">SignUp</a>

Các liên kết không an toàn có thể được hiển thị dưới dạng

<a href="{{url('/aboutus',[],false)}}">About US</a></li>
<a href="{{url('/promotion',[],false)}}">Get the deal now!</a></li>

Điều này làm là hiển thị một URL đủ điều kiện, chẳng hạn như https: // yourhost / loginhttp: // yourhost / aboutus

Nếu bạn không hiển thị URL đủ điều kiện bằng http và sử dụng url liên kết tương đối ('/ aboutus') thì https sẽ vẫn tồn tại sau khi người dùng truy cập trang web an toàn.

Hi vọng điêu nay co ich!


7

Điều gì về việc chỉ sử dụng tệp .htaccess để đạt được chuyển hướng https? Điều này nên được đặt trong thư mục gốc của dự án (không phải trong thư mục chung). Máy chủ của bạn cần được cấu hình để trỏ đến thư mục gốc của dự án.

<IfModule mod_rewrite.c>
   RewriteEngine On
   # Force SSL
   RewriteCond %{HTTPS} !=on
   RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
   # Remove public folder form URL
   RewriteRule ^(.*)$ public/$1 [L]
</IfModule>

Tôi sử dụng cái này cho laravel 5.4 (phiên bản mới nhất khi viết câu trả lời này) nhưng nó sẽ tiếp tục hoạt động cho các phiên bản tính năng ngay cả khi laravel thay đổi hoặc loại bỏ một số chức năng.


Chrome cho tôi một lỗi: Quá nhiều chuyển hướng .. Có vẻ như điều này tạo ra một vòng lặp
phượng hoàng

Xin chào, tôi đã cập nhật câu trả lời. Đảm bảo rằng bạn đặt .htaccess này trong thư mục gốc của dự án và trỏ máy chủ của bạn (cấu hình apache) tới thư mục gốc của dự án.
Maulik Gangani

1
@MladenJanjetovic, bạn có thể có các tệp htaccess khác nhau cho các môi trường này
Burgi

1
@MladenJanjetovic có nó trong ứng dụng chắc chắn có lợi thế của nó, nhưng từ góc độ hiệu quả và tốc độ, tôi muốn nói rằng sẽ có lợi khi có điều này trong cấu hình máy chủ để bạn không phải tải lên Laravel chỉ để chuyển hướng. Configs môi trường cụ thể trong một .htaccess là phiên bản duy nhất có thể đạt được bằng cách sử dụng một điều kiện viết lại để kiểm tra tên miền, một cái gì đó giống nhưRewriteCond %{HTTP_HOST} productiondomain\.com$ [NC]
Chris

1
Tôi cũng thích đặt nó trong .htaccess trong thư mục gốc và như Crhis đã nói, các cài đặt dành riêng cho môi trường có thể được thực hiện ở đây, mặc dù kém thanh lịch hơn một chút so với giải pháp của Mladen.
jovan 17/1218

6

Bạn có thể sử dụng RewriteRule để buộc ssl trong .htaccess cùng thư mục với index.php của bạn.
Vui lòng thêm dưới dạng ảnh đính kèm, thêm nó trước khi tất cả các quy tắc khác thiết lập ssl .htaccess


3

trong IndexController.php đặt

public function getIndex(Request $request)
{
    if ($request->server('HTTP_X_FORWARDED_PROTO') == 'http') {

        return redirect('/');
    }

    return view('index');
}

trong AppServiceProvider.php đưa

public function boot()
{
    \URL::forceSchema('https');

}

Trong AppServiceProvider.php mọi chuyển hướng sẽ được chuyển đến url https và đối với yêu cầu http, chúng ta cần chuyển hướng một lần vì vậy trong IndexController.php Chỉ cần chúng ta chuyển hướng một lần


Bạn có thể giải thích cách trả lời của bạn giải quyết câu hỏi không?
soundlikeodd

Vui lòng thêm lời giải thích này vào câu trả lời của bạn.
soundlikeodd


3

Tôi đang thêm giải pháp thay thế này vì tôi đã phải chịu đựng rất nhiều với vấn đề này. Tôi đã thử tất cả các cách khác nhau và không có gì hiệu quả. Vì vậy, tôi đã đưa ra một giải pháp cho nó. Nó có thể không phải là giải pháp tốt nhất nhưng nó hoạt động -

FYI, tôi đang sử dụng Laravel 5.6

if (App::environment('production')) {
    URL::forceScheme('https');
}

production <- Nó phải được thay thế bằng giá trị APP_ENV trong tệp .env của bạn


2

Đây là cách thực hiện trên Heroku

Để buộc SSL trên dynos của bạn nhưng không phải cục bộ, hãy thêm vào cuối .htaccess của bạn ở chế độ công khai /:

# Force https on heroku...
# Important fact: X-forwarded-Proto will exist at your heroku dyno but wont locally.
# Hence we want: "if x-forwarded exists && if its not https, then rewrite it":
RewriteCond %{HTTP:X-Forwarded-Proto} .
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

Bạn có thể kiểm tra điều này trên máy cục bộ của mình bằng:

curl -H"X-Forwarded-Proto: http" http://your-local-sitename-here

Điều đó đặt tiêu đề X được chuyển tiếp sang dạng mà nó sẽ có trên heroku.

tức là nó mô phỏng cách một heroku dyno sẽ thấy một yêu cầu.

Bạn sẽ nhận được phản hồi này trên máy cục bộ của mình:

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>301 Moved Permanently</title>
</head><body>
<h1>Moved Permanently</h1>
<p>The document has moved <a href="https://tm3.localhost:8080/">here</a>.</p>
</body></html>

Đó là một chuyển hướng. Đó là những gì heroku sẽ trả lại cho khách hàng nếu bạn đặt .htaccess như trên. Nhưng nó không xảy ra trên máy cục bộ của bạn vì X-forwarded sẽ không được đặt (chúng tôi đã giả mạo nó bằng cách cuộn ở trên để xem điều gì đang xảy ra).


2

Nếu đang sử dụng CloudFlare, bạn chỉ có thể tạo Quy tắc trang để luôn sử dụng HTTPS: Buộc SSL Cloudflare Điều này sẽ chuyển hướng mọi yêu cầu http: // đến https: //

Ngoài ra, bạn cũng sẽ phải thêm một cái gì đó như thế này vào hàm \ app \ Providers \ AppServiceProvider.php boot () của mình:

if (env('APP_ENV') === 'production' || env('APP_ENV') === 'dev') {
     \URL::forceScheme('https');
}

Điều này sẽ đảm bảo rằng mọi liên kết / đường dẫn trong ứng dụng của bạn đang sử dụng https: // thay vì http: //.


2

Một cách tiếp cận khác một chút, được thử nghiệm trong Laravel 5.7

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Str;

class ForceHttps
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {    
        if ( !$request->secure() && Str::startsWith(config('app.url'), 'https://') ) {
            return redirect()->secure($request->getRequestUri());
        }
        return $next($request);
    }
}

Tái bút. Mã được cập nhật dựa trên nhận xét của @ matthias-lill.


1
Hoạt động trên Laravel 6 cũng vậy.
Rubens

1
sử dụng các hàm env () sẽ không hoạt động với các tệp cấu hình đã lưu trong bộ nhớ cache. config('app.url')Thay vào đó, điều này sẽ chỉ đến . Ngoài ra, Laravel đi kèm với một hàm chuỗi rất tiện dụng Str::startsWith(config('app.url'), 'https://').
Matthias Lill

1

Đối với Laravel 5.6, tôi đã phải thay đổi điều kiện một chút để nó hoạt động.

từ:

if (!$request->secure() && env('APP_ENV') === 'prod') {
return redirect()->secure($request->getRequestUri());
}

Đến:

if (empty($_SERVER['HTTPS']) && env('APP_ENV') === 'prod') {
return redirect()->secure($request->getRequestUri());
}

1

Điều này đã làm việc cho tôi. Tôi đã tạo một mã php tùy chỉnh để buộc chuyển hướng nó đến https. Chỉ cần bao gồm mã này trên header.php

<?php
if (isset($_SERVER['HTTPS']) &&
    ($_SERVER['HTTPS'] == 'on' || $_SERVER['HTTPS'] == 1) ||
    isset($_SERVER['HTTP_X_FORWARDED_PROTO']) &&
    $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') {
  $protocol = 'https://';
}
else {
  $protocol = 'http://';
}
$notssl = 'http://';
if($protocol==$notssl){
    $url = "https://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";?>
    <script> 
    window.location.href ='<?php echo $url?>';
    </script> 
 <?php } ?>

1

Tôi đang sử dụng phần mềm trung gian tiếp theo của Laravel 5.6.28:

namespace App\Http\Middleware;

use App\Models\Unit;
use Closure;
use Illuminate\Http\Request;

class HttpsProtocol
{
    public function handle($request, Closure $next)
    {
        $request->setTrustedProxies([$request->getClientIp()], Request::HEADER_X_FORWARDED_ALL);

        if (!$request->secure() && env('APP_ENV') === 'prod') {
            return redirect()->secure($request->getRequestUri());
        }

        return $next($request);
    }
}

1

Cách dễ nhất là ở cấp ứng dụng. Trong file

app/Providers/AppServiceProvider.php

thêm những điều sau:

use Illuminate\Support\Facades\URL;

và trong phương thức boot (), hãy thêm phần sau:

$this->app['request']->server->set('HTTPS', true);
URL::forceScheme('https');

Điều này sẽ chuyển hướng tất cả yêu cầu đến https ở cấp ứng dụng.

(Lưu ý: điều này đã được thử nghiệm với laravel 5.5 LTS)


1

Bạn có thể đơn giản vào ứng dụng -> Nhà cung cấp -> AppServiceProvider.php

thêm hai dòng

sử dụng Illuminate \ Support \ Facades \ URL;

URL :: forceScheme ('https');

như hiển thị trong các mã sau:

use Illuminate\Support\Facades\URL;

class AppServiceProvider extends ServiceProvider
{
   public function boot()
    {
        URL::forceScheme('https');

       // any other codes here, does not matter.
    }

0

Công việc này đối với tôi trong Laravel 7.x trong 3 bước đơn giản bằng cách sử dụng phần mềm trung gian:

1) Tạo phần mềm trung gian bằng lệnh php artisan make:middleware ForceSSL

Phần mềm trung gian

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\App;

class ForceSSL
{
    public function handle($request, Closure $next)
    {
        if (!$request->secure() && App::environment() === 'production') {
            return redirect()->secure($request->getRequestUri());
        }

        return $next($request);
    }
}

2) Đăng ký phần mềm trung gian trong routeMiddlewaretệp Kernel bên trong

Kernel

protected $routeMiddleware = [
    //...
    'ssl' => \App\Http\Middleware\ForceSSL::class,
];

3) Sử dụng nó trong các tuyến đường của bạn

Các tuyến đường

Route::middleware('ssl')->group(function() {
    // All your routes here

});

đây là tài liệu đầy đủ về phần mềm trung gian

========================

Phương pháp .HTACCESS

Nếu bạn muốn sử dụng .htaccesstệp, bạn có thể sử dụng mã sau:

<IfModule mod_rewrite.c>
    RewriteEngine On 
    RewriteCond %{SERVER_PORT} 80 
    RewriteRule ^(.*)$ https://yourdomain.com/$1 [R,L]
</IfModule>

Trân trọng!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.