लारवेल 5 - HTTPS पर पुनर्निर्देशित


127

मेरे पहले Laravel 5 प्रोजेक्ट पर काम करना और यह सुनिश्चित करना कि मेरे ऐप पर HTTPS को लागू करने के लिए तर्क कहाँ या कैसे दिए जाएँ। यहां क्लिनिक यह है कि ऐप की ओर इशारा करने वाले कई डोमेन हैं और तीन में से केवल दो एसएसएल का उपयोग किया जाता है (तीसरा एक फ़ॉलबैक डोमेन है, लंबी कहानी)। इसलिए मैं .htaccess के बजाय अपने ऐप के तर्क में इसे संभालना चाहता हूं।

लारवेल 4.2 में मैंने इस कोड के साथ पुनर्निर्देशित किया, जो इसमें स्थित है filters.php:

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

मैं सोच रहा हूं कि मिडलवेयर वह जगह है जहां कुछ इस तरह से लागू किया जाना चाहिए, लेकिन मैं इसका उपयोग करके यह पता नहीं लगा सकता।

धन्यवाद!

अपडेट करें

यदि आप क्लाउडफेयर का उपयोग कर रहे हैं जैसे कि मैं हूं, तो यह आपके नियंत्रण कक्ष में एक नया पृष्ठ नियम जोड़कर पूरा किया जाता है।


तो 3 जी डोमेन के साथ क्या होता है? यदि आप सभी मार्गों पर https बल देते हैं - तो क्या तीसरा डोमेन काम करता रहेगा?
लॉरेंस

यह पता लगा रहा है कि$_SERVER['HTTP_HOST']
4

क्लाउडफ्लेयर पेज नियम को प्रभावी होने में कितना समय लगा
कोडगुरू

ओह, मुझे DNS सेटिंग haha ​​में प्रॉक्सी पर स्विच करना पड़ा!
कोडगुरु

जवाबों:


253

आप इसे मिडलवेयर क्लास के साथ काम कर सकते हैं। मैं आपको एक विचार देता हूं।

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

फिर, इस अनुरोध को Kernel.phpफ़ाइल में नियम सेट करते हुए हर अनुरोध पर लागू करें , जैसे:

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'       

];

ऊपर के नमूने पर, मिडलवेयर हर अनुरोध को https में रीडायरेक्ट करेगा यदि:

  1. वर्तमान अनुरोध बिना सुरक्षित प्रोटोकॉल (http) के आता है
  2. यदि आपका पर्यावरण बराबर है production। तो, बस अपनी वरीयताओं के अनुसार सेटिंग्स समायोजित करें।

CloudFlare

मैं एक वाइल्डकार्ड SSL के साथ उत्पादन वातावरण में इस कोड का उपयोग कर रहा हूं और कोड सही तरीके से काम करता है। अगर मैं && App::environment() === 'production'इसे लोकलहोस्ट में हटाता हूं और टेस्ट करता हूं , तो रीडायरेक्शन भी काम करता है। तो, SSL स्थापित होना या न होना समस्या नहीं है। ऐसा लगता है कि आपको Https प्रोटोकॉल पर पुनर्निर्देशित करने के लिए अपनी Cloudflare लेयर पर बहुत अधिक ध्यान रखने की आवश्यकता है।

23/03/2015 संपादित करें

धन्यवाद के @Adam Linkसुझाव के लिए: यह हेडर के कारण होने की संभावना है जो क्लाउडफेयर गुजर रहा है। CloudFlare संभवतः HTTP के माध्यम से आपके सर्वर को हिट करता है और एक X- फ़ॉर्वर्ड-प्रोटो हेडर पास करता है जो यह घोषणा करता है कि यह HTTPS अनुरोध अग्रेषित कर रहा है। आपको अपने मिडलवेयर में एक और लाइन जोड़ने की आवश्यकता है जो कहती है ...

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

... हेडर पर भरोसा करने के लिए CloudFlare भेज रहा है। यह पुनर्निर्देशित लूप को रोक देगा

संपादित करें 27/09/2016 - लारवेल v5.3

बस मध्यवर्ग को webसमूह में जोड़ने की आवश्यकता है 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

    ],
];

याद रखें कि webसमूह डिफ़ॉल्ट रूप से हर मार्ग पर लागू होता है, इसलिए आपको न तो webमार्गों में स्पष्ट रूप से निर्धारित करने की आवश्यकता है और न ही नियंत्रकों की।

संपादित करें 23/08/2018 - लारवेल v5.7

  • आपके द्वारा उपयोग किए जा सकने वाले वातावरण के आधार पर अनुरोध को पुनर्निर्देशित करना App::environment() === 'production'। पिछले संस्करण के लिए था env('APP_ENV') === 'production'
  • \URL::forceScheme('https');वास्तव में उपयोग करने से पुनर्निर्देश नहीं होता है। https://वेबसाइट के रेंडर होने के बाद यह केवल लिंक बनाता है।

5
यह मुझे एक अनुप्रेषित लूप दे रहा है ... लगता है जैसे इसे काम करना चाहिए, हालांकि। मुझे नहीं पता कि इससे कोई फ़र्क पड़ता है लेकिन हम क्लाउडफ़ेयर SSL का उपयोग कर रहे हैं। लेकिन मुझे नहीं लगता कि यह साधारण रीडायरेक्ट को बदलेगा।
रातMICU

3
@NightMICU मुझे यकीन नहीं है कि अगर आपने समस्या को पुनर्निर्देशित कर लिया है, लेकिन यह हेडर के कारण संभव है कि Cloudflare गुजर रहा है। CloudFlare संभवतः HTTP के माध्यम से आपके सर्वर को हिट करता है और एक X- फ़ॉर्वर्ड-प्रोटो हेडर पास करता है जो यह घोषणा करता है कि यह HTTPS अनुरोध अग्रेषित कर रहा है। आपको अपने मिडलवेयर में एक और लाइन जोड़ने की आवश्यकता है $request->setTrustedProxies( [ $request->getClientIp() ] );जो हेडर को भरोसा करने के लिए कहती है CloudFlare भेज रहा है। यह पुनर्निर्देशित लूप को रोक देगा।
एडम लिंक

2
@ मैनिक्स बहुत बढ़िया। इस HTTPS के माध्यम से इस सप्ताह के अंत में मेरी खुद की परियोजना के माध्यम से चला गया - वह छोटा सामान आपको घंटों तक निराश करेगा!
एडम लिंक

8
बहुत बढ़िया जवाब! बस एक विवरण: Google को इंगित करने के लिए 301 पुनर्निर्देशित का उपयोग करना बेहतर है जो एक स्थायी आंदोलन है। जैसे:return redirect()->secure($request->getRequestUri(), 301);
एड्रियोकका

4
लोड बैलेंसर या प्रॉक्सी के तहत उन लोगों के लिए जो $request->server('HTTP_X_FORWARDED_PROTO') != 'https'मेरे लिए इस काम को सुरक्षित () में बदल सकते हैं
शिरो

63

एक अन्य विकल्प जो मेरे लिए काम करता है, AppServiceProvider में इस कोड को बूट विधि में रखा गया है:

\URL::forceScheme('https');

फ़ोर्सस्केम ('https') से पहले लिखा गया फंक्शन गलत था, उसका फोर्ससचेम


16
अरे, यह चारों ओर googling के माध्यम से पाया - ध्यान दें कि 5.4 में यह है\URL::forceScheme('https');
देव

5
उसी फ़ाइल में, आप यह भी कर सकते हैंif($this->app->environment() === 'production'){ $this->app['request']->server->set('HTTPS', true); }
रोरी

2
क्या आपका मतलब था\URL::forceScheme('https')
अर्नेस्ट ओकोट

17
मुझे पूरा यकीन है कि यह केवल लिंक बनाने के लिए है। यह उपयोगकर्ता को https के लिए बाध्य नहीं करेगा, यह केवल https: // से जुड़े लिंक पर काम करेगा:
वेस्टन वॉट्सन

हाँ, यह @WestonWatson हुआ। कृपया समाधान प्राप्त करें यदि पाए
हरत

33

वैकल्पिक रूप से, यदि आप अपाचे का उपयोग कर रहे हैं, तो आप उपसर्ग .htaccessका उपयोग करने के लिए अपने URL को लागू करने के लिए फ़ाइल का उपयोग कर सकते हैं https। Laravel 5.4 पर, मैंने अपनी .htaccessफ़ाइल में निम्न पंक्तियाँ जोड़ीं और यह मेरे लिए काम की है।

RewriteEngine On

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

2
यह अच्छा नहीं है अगर आपके पास उन सभी पर एसएसएल सेट करने की आवश्यकता से अधिक वातावरण (देव, मंच, उत्पादन) है।
म्लादेन जेनजेटोविक

@MladenJanjetovic आप इसके RewriteCond %{HTTP_HOST} !=localhostचारों ओर जाने के लिए देव पर उपयोग कर सकते हैं ।
दान

3
@Dan - हाँ, लेकिन आपको अभी भी इसे स्टेज के लिए सेट करना होगा, लोकल (और यह अधिक जटिल है यदि डेवलपर्स स्थानीय विकास में अलग-अलग URL का उपयोग कर रहे हैं, जैसे कि .dev, .Local, subdomains, ... आदि)। मैं आवेदन में उस तरह का तर्क रखना पसंद करूंगा।
म्लाडेन जन्जेटोविक

16

लार्वाॅल 5.4 के लिए .htaccess के बजाय https पुनर्निर्देशन प्राप्त करने के लिए इस प्रारूप का उपयोग करें

namespace App\Providers;

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

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

15
बस स्पष्ट करने के लिए: 1) ये परिवर्तन ऐप / प्रदाता / AppServiceProvider.php में किए जाने चाहिए; 2) यह केवल एसएसएल का उपयोग करने के लिए ऐप के अंदर उत्पन्न लिंक को सेट करने के लिए है, यह आपको एसएसएल का उपयोग करने के लिए मजबूर नहीं करता है
फीनिक्स

नमस्ते, रूट इस विधि से उत्पन्न नहीं कर रहा है अगर मैं एक बटन पर क्लिक करता हूं जो मुझे अगले मार्ग पर भेज देता है तो मुझे त्रुटि 404 नहीं दे रहा है
साकेत सिन्हा

यह एक https रीडायरेक्ट नहीं है। लेकिन यह https: // साइट की सेवा की अनुमति देता है। यदि आप इसे http: // में बदलते हैं तो यह भी काम करेगा।
फ्रैंक

12

मैनिक्स के उत्तर के समान लेकिन एक स्थान पर। 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);
    }
}

क्या अनुरोध को स्थिर होने की आवश्यकता है?
GFxJamal

@jRhesk यह शायद नहीं है, लेकिन कृपया कोशिश करें और उत्तर को संशोधित करने के लिए स्वतंत्र महसूस करें
Mladen Janjetovic

8

यह लार्वा 5.2.x और अधिक के लिए है। यदि आप HTTPS पर कुछ सामग्री और HTTP पर दूसरों की सेवा करने का विकल्प चाहते हैं, तो एक समाधान है जो मेरे लिए काम करता है। आप आश्चर्यचकित हो सकते हैं, कोई व्यक्ति HTTPS पर केवल कुछ सामग्री क्यों परोसना चाहता है? HTTPS पर सब कुछ क्यों नहीं परोसें?

हालाँकि, HTTPS पर पूरी साइट की सेवा करना पूरी तरह से ठीक है, HTTPS पर सब कुछ अलग करने से आपके सर्वर पर एक अतिरिक्त ओवरहेड होता है। याद रखें एन्क्रिप्शन सस्ता नहीं आता है। मामूली ओवरहेड का आपके एप्लिकेशन प्रतिक्रिया समय पर भी प्रभाव पड़ता है। आप तर्क दे सकते हैं कि कमोडिटी हार्डवेयर सस्ता है और प्रभाव नगण्य है, लेकिन मैं पचाता हूं :) मुझे https पर छवियों आदि के साथ मार्केटिंग कंटेंट बड़े पेजों को परोसने का विचार पसंद नहीं है। तो यहाँ यह जाता है। यह ऐसा ही है जैसा कि दूसरों ने मिडलवेयर का उपयोग करके ऊपर सुझाव दिया है, लेकिन यह एक पूर्ण समाधान है जो आपको HTTP / HTTPS के बीच आगे और पीछे टॉगल करने की अनुमति देता है।

सबसे पहले एक मिडलवेयर बनाएं।

php artisan make:middleware ForceSSL

यह वही है जो आपके मिडलवेयर को दिखना चाहिए।

<?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);
    }
}

ध्यान दें कि मैं पर्यावरण के आधार पर फ़िल्टर नहीं कर रहा हूं क्योंकि मेरे पास स्थानीय देव और उत्पादन दोनों के लिए HTTPS सेटअप है, इसलिए इसकी आवश्यकता नहीं है।

निम्नलिखित को अपने मार्ग पर जोड़ें: \ _ \ _ \ _ \ _ \ _ \ _ \ _ \ _ \ _ \ _ \ _ \ _ \ _ \ _ कर्नेल \ _ \ _ \ _ \ _ \ _ \ _ \ _ \ _ \ _ कर्नेल.php को अपने रूट में जोड़ें ताकि आप चुन सकें और चुन सकें कि किस रूट समूह को एसएसएल को मजबूर करना चाहिए।

    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,
];

इसके बाद, मैं दो मूल समूहों लॉगिन / साइनअप आदि को सुरक्षित करना चाहता हूं और प्रामाणिक मिडलवेयर के पीछे सब कुछ।

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

पुष्टि करें कि आपके बिचौलिये कंसोल से आपके मार्गों पर ठीक से लागू होते हैं।

php artisan route:list

अब आपने अपने आवेदन के सभी रूपों या संवेदनशील क्षेत्रों को सुरक्षित कर लिया है, कुंजी अब अपने सुरक्षित और सार्वजनिक (गैर https) लिंक को परिभाषित करने के लिए अपने दृश्य टेम्पलेट का उपयोग करना है।

ऊपर दिए गए उदाहरण के आधार पर आप अपने सुरक्षित लिंक निम्नानुसार प्रस्तुत करेंगे -

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

गैर सुरक्षित लिंक के रूप में प्रदान किया जा सकता है

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

यह जो करता है वह https: // yourhost / login और http: // yourhost / aboutus जैसे पूरी तरह से योग्य URL को प्रस्तुत करता है

यदि आप http के साथ पूरी तरह से योग्य URL रेंडर नहीं करते थे और एक रिश्तेदार लिंक url ('/ aboutus') का उपयोग करते हैं, तो उपयोगकर्ता सुरक्षित साइट पर जाने के बाद https जारी रहेगा।

उम्मीद है की यह मदद करेगा!


7

Https रीडायरेक्ट प्राप्त करने के लिए बस .htaccess फ़ाइल का उपयोग करने के बारे में क्या ? इसे प्रोजेक्ट रूट (सार्वजनिक फ़ोल्डर में नहीं) में रखा जाना चाहिए। आपके सर्वर को प्रोजेक्ट रूट डायरेक्टरी में इंगित करने के लिए कॉन्फ़िगर करने की आवश्यकता है।

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

मैं लार्वा 5.4 के लिए इसका उपयोग करता हूं (इस उत्तर को लिखने के रूप में नवीनतम संस्करण) लेकिन यह सुविधा संस्करणों के लिए काम करना जारी रखना चाहिए, भले ही लार्वा कुछ परिवर्तन को हटा दें या हटा दें।


Chrome मुझे एक त्रुटि देता है: बहुत सारे पुनर्निर्देश .. ऐसा लगता है कि
फ़ीनिक्स

नमस्ते, मैंने उत्तर अपडेट कर दिया है। सुनिश्चित करें कि आपने इस .htaccess को प्रोजेक्ट रूट डायरेक्टरी में रखा है और प्रोजेक्ट को रूट करने के लिए अपने सर्वर (अपाचे कॉन्फिग) को इंगित करें।
मौलिक गंगानी

1
@MladenJanjetovic आपके पास इन वातावरणों के लिए अलग-अलग htaccess फाइलें हो सकती हैं
Burgi

1
@MladenJanjetovic के अनुप्रयोग में होने के कारण निश्चित रूप से इसके फायदे हैं, लेकिन एक दक्षता और गति के दृष्टिकोण से, मैं कहूंगा कि सर्वर कॉन्फ़िगरेशन में ऐसा होना लाभप्रद है, ताकि आपको लारवेल को सिर्फ एक रीडायरेक्ट के लिए लोड न करना पड़े। एकल-संस्करण में पर्यावरण-विशिष्ट कॉन्फ़िगरेशन .htaccess डोमेन की जाँच के लिए एक पुनर्लेखन शर्त का उपयोग करके प्राप्त किया जा सकता है, कुछ इस तरहRewriteCond %{HTTP_HOST} productiondomain\.com$ [NC]
क्रिस

1
मैं इसे मूल निर्देशिका में .htaccess में रखना पसंद करता हूं, और जैसा कि क्रिस ने कहा, पर्यावरण-विशिष्ट सेटिंग्स यहां पूरी की जा सकती हैं, भले ही म्लाडेन के समाधान की तुलना में थोड़ा कम सुरुचिपूर्ण ढंग से।
जोवान

6

आप अपने अनुक्रमणिका के साथ ssl को .htaccess फ़ोल्डर में बाध्य करने के लिए RewriteRule का उपयोग कर सकते हैं।
कृपया चित्र संलग्न के रूप में जोड़ें, इसे सभी नियम से पहले जोड़ें। ssl .htaccess सेट करना


3

IndexController.php में डाल दिया

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

        return redirect('/');
    }

    return view('index');
}

AppServiceProvider.php में डाल दिया

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

}

AppServiceProvider.php में हर रीडायरेक्ट को url https पर जाना होगा और http रिक्वेस्ट के लिए हमें IndexController.php में एक बार रीडायरेक्ट करना होगा। बस हमें एक बार रीडायरेक्ट करने की जरूरत है


क्या आप बता सकते हैं कि आपका उत्तर प्रश्न को कैसे हल करता है?
लगता है

कृपया इस स्पष्टीकरण को अपने उत्तर में जोड़ें।
लगता है

3

ऊपर दिए गए उत्तर मेरे लिए काम नहीं करते थे, लेकिन ऐसा प्रतीत होता है कि डेनिज़ तुरान ने हेरोको के लोड बैलेंसर के साथ काम करने के तरीके में .htaccess को फिर से लिखा है: https://www.jcore.com/2017/01/29/force-https ऑन-Heroku-का उपयोग कर-इनको /

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

3

मैं इस विकल्प को जोड़ रहा हूं क्योंकि मुझे इस मुद्दे के साथ बहुत कुछ सहना पड़ा। मैंने सभी तरह से कोशिश की और कुछ भी काम नहीं किया। इसलिए, मैं इसके लिए वर्कअराउंड लेकर आया हूं। यह सबसे अच्छा समाधान नहीं हो सकता है लेकिन यह काम करता है -

FYI करें, मैं Laravel 5.6 का उपयोग कर रहा हूं

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

उत्पादन <- इसे आपकी .env फ़ाइल में APP_ENV मान से बदला जाना चाहिए


2

हिरोकू पर यह कैसे करना है

एसएसएल को अपने डायनोस पर मजबूर करने के लिए लेकिन स्थानीय रूप से, सार्वजनिक / में अपने .htaccess के अंत में जोड़ें:

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

आप अपने स्थानीय मशीन पर इसका परीक्षण कर सकते हैं:

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

यह हैडर को उस फॉर्म पर अग्रसारित करता है, जिसे वह हरको पर ले जाएगा।

यानी यह अनुकरण करता है कि कैसे एक हिक्कु डिनो एक अनुरोध देखेगा।

आपको अपनी स्थानीय मशीन पर यह प्रतिक्रिया मिलेगी:

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

वह एक पुनर्निर्देश है। यही कारण है कि यदि आप उपरोक्त के रूप में .htaccess सेट करते हैं, तो एक ग्राहक को वापस देने जा रहा है। लेकिन यह आपके स्थानीय मशीन पर नहीं होता है क्योंकि एक्स-फ़ॉर्वर्ड सेट नहीं किया जाएगा (हम इसे ऊपर कर्ल के साथ नकली कर रहे हैं यह देखने के लिए कि क्या हो रहा था)।


2

यदि आप CloudFlare का उपयोग कर रहे हैं, तो आप HTTPS का उपयोग करने के लिए हमेशा एक पृष्ठ नियम बना सकते हैं: एसएसएल क्लाउडफ़्लेयर को मजबूर करें यह हर http: // अनुरोध को https: // पर पुनर्निर्देशित करेगा।

इसके अलावा, आपको अपने \ app \ Providers \ AppServiceProvider.php बूट () फ़ंक्शन में कुछ इस तरह जोड़ना होगा:

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

यह सुनिश्चित करेगा कि आपके ऐप का प्रत्येक लिंक / पथ http: // के बजाय http: // का उपयोग कर रहा है।


2

थोड़ा अलग दृष्टिकोण, लारवेल 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);
    }
}

पुनश्च। @ Matthias-lill की टिप्पणियों के आधार पर कोड अपडेट किया गया।


1
लारवेल 6 पर भी काम करता है।
रूबेंस

1
env () फ़ंक्शंस का उपयोग कैश्ड कॉन्फिग फाइलों के साथ नहीं होगा। इसके config('app.url')बजाय इंगित करना चाहिए । इसके अलावा, लारवेल एक बहुत ही आसान स्ट्रिंग फ़ंक्शन के साथ आता है Str::startsWith(config('app.url'), 'https://')
मथायस लिल

1

लारवेल 5.6 के लिए, मुझे इसे काम करने के लिए स्थिति को थोड़ा बदलना पड़ा।

से:

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

सेवा:

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

1

इसने मेरे लिए काम किया। मैंने इसे https में पुनर्निर्देशित करने के लिए एक कस्टम php कोड बनाया। इस कोड को शीर्ष लेख में शामिल करें। 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

मैं 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

सबसे आसान तरीका आवेदन स्तर पर होगा। फ़ाइल में

app/Providers/AppServiceProvider.php

निम्नलिखित जोड़ें:

use Illuminate\Support\Facades\URL;

और बूट में () विधि निम्नलिखित जोड़ें:

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

यह आवेदन के स्तर पर https के लिए सभी अनुरोधों को पुनर्निर्देशित करना चाहिए।

(नोट: यह लार्वा 5.5 एलटीएस के साथ परीक्षण किया गया है)


1

आप ऐप -> प्रदाता -> AppServiceProvider.php पर जा सकते हैं

दो लाइनें जोड़ें

Illuminate \ Support \ Facades \ URL का उपयोग करें;

यूआरएल :: forceScheme ( 'https');

निम्नलिखित कोड में दिखाता है:

use Illuminate\Support\Facades\URL;

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

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

0

मेरे लिए यह काम 3 सरल चरणों में लारवेल 7.x में हैएक मिडलवेयर का उपयोग करके :

1) कमांड के साथ मिडलवेयर उत्पन्न करें php artisan make:middleware ForceSSL

मध्यस्थ

<?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) मिडिलवेयर को routeMiddlewareकर्नेल फ़ाइल के अंदर रजिस्टर करें

गुठली

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

3) अपने मार्गों में इसका उपयोग करें

मार्गों

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

});

यहाँ बिचौलियों के बारे में पूर्ण प्रलेखन

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

.HTACCESS विधि

यदि आप किसी .htaccessफ़ाइल का उपयोग करना पसंद करते हैं , तो आप निम्न कोड का उपयोग कर सकते हैं:

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

सादर!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.