ল্যারাভেল 5 - এইচটিটিপিএসে পুনর্নির্দেশ করুন


127

আমার প্রথম লারাভেল 5 প্রকল্পে কাজ করা এবং আমার অ্যাপটিতে এইচটিটিপিএসকে বাধ্য করার জন্য কোথায় বা কীভাবে যুক্তি স্থাপন করবেন তা নিশ্চিত নয়। এখানে ক্লিঞ্জারটি হ'ল এখানে অনেকগুলি ডোমেন অ্যাপ্লিকেশনটির দিকে নির্দেশ করছে এবং তিনজনের মধ্যে মাত্র দুটি এসএসএল ব্যবহার করে (তৃতীয়টি ফ্যালব্যাক ডোমেন, দীর্ঘ গল্প)। সুতরাং আমি এটি আমার অ্যাপ্লিকেশনটির লজিক .htaccess এর চেয়ে পরিচালনা করতে চাই।

লারাভেল ৪.২ এ আমি এই কোডটি দিয়ে পুনঃনির্দেশটি সম্পন্ন করেছি filters.php:

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

আমি ভাবছি মিডলওয়্যার হ'ল যেখানে এই জাতীয় কিছু কার্যকর করা উচিত তবে এটি ব্যবহার করে আমি এটি বেশ বের করতে পারি না।

ধন্যবাদ!

হালনাগাদ

আপনি যদি আমার মতো ক্লাউডফ্লেয়ার ব্যবহার করেন তবে এটি আপনার নিয়ন্ত্রণ প্যানেলে একটি নতুন পৃষ্ঠা বিধি যুক্ত করে সম্পন্ন হবে accomp


তাহলে 3 য় ডোমেন দিয়ে কি হবে? আপনি যদি সমস্ত রুটে https জোর করে - তৃতীয় ডোমেন কি কাজ চালিয়ে যাবে?
লরেন্স

এর সাথে $_SERVER['HTTP_HOST']
শনাক্ত করা হচ্ছে

ক্লাউডফ্লেয়ার পৃষ্ঠার নিয়মটি কার্যকর হতে কতক্ষণ সময় নিল
কোডগুরু

ওহ, আমাকে ডিএনএস সেটিংয়ে প্রক্সি চালু করতে হয়েছিল হা হা!
কোডগুরু

উত্তর:


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। সুতরাং, আপনার পছন্দ অনুযায়ী সেটিংস সামঞ্জস্য করুন।

ক্লাউডফ্লেয়ার

আমি এই কোডটি একটি ওয়াইল্ডকার্ড এসএসএল সহ উত্পাদন পরিবেশে ব্যবহার করছি এবং কোডটি সঠিকভাবে কাজ করে। যদি আমি && App::environment() === 'production'লোকালহোস্টে এটি সরিয়ে এবং পরীক্ষা করি তবে পুনঃনির্দেশটিও কাজ করে। সুতরাং, ইনস্টল করা এসএসএল থাকা বা না থাকা সমস্যা নয়। দেখে মনে হচ্ছে এইচটিপিএস প্রোটোকলে আপনাকে পুনঃনির্দেশিত করতে আপনার ক্লাউডফ্লেয়ার স্তরটিতে খুব কঠোর মনোযোগ রাখা দরকার।

23/03/2015 সম্পাদনা করুন

আপনার @Adam Linkপরামর্শের জন্য ধন্যবাদ : ক্লাউডফ্লেয়ার যে শিরোনামগুলি দ্বারা চলছে তা সম্ভবত এটিই ঘটেছে। ক্লাউডফ্লেয়ার সম্ভবত আপনার সার্ভারকে এইচটিটিপি-র মাধ্যমে হিট করে এবং একটি এক্স-ফরওয়ার্ড-প্রোটো শিরোনাম পাস করে যা ঘোষণা করে যে এটি এইচটিটিপিএস অনুরোধটি ফরোয়ার্ড করছে। আপনার মিডলওয়্যারগুলিতে আপনাকে আরও একটি লাইন যুক্ত করতে হবে যা বলবে ...

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

... হেডারের উপর আস্থা রাখতে ক্লাউডফ্লেয়ার প্রেরণ করছে। এটি পুনঃনির্দেশ লুপ বন্ধ করবে

27/09/2016 সম্পাদনা করুন - লারাভেল ভি 5.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
এটি আমাকে পুনর্নির্দেশের লুপ দিচ্ছে বলে মনে হচ্ছে ... যদিও এটি কাজ করা উচিত। আমি জানি না এটির কোনও পার্থক্য রয়েছে কিনা তবে আমরা একটি ক্লাউডফ্লেয়ার এসএসএল ব্যবহার করছি। তবে আমি মনে করি না যে এটি সরল পুনঃনির্দেশকে পরিবর্তন করবে।
নাইটমিকু

3
@ নাইটমিকু আপনি পুনঃনির্দেশ দিয়ে সমস্যাটি সমাধান করেছেন কিনা তা সম্পর্কে আমি নিশ্চিত নই, তবে ক্লাউডফ্লেয়ার যে শিরোনামে চলেছে তা সম্ভবত এটির কারণেই হয়েছে। ক্লাউডফ্লেয়ার সম্ভবত আপনার সার্ভারকে এইচটিটিপি-র মাধ্যমে হিট করে এবং একটি এক্স-ফরওয়ার্ড-প্রোটো শিরোনাম পাস করে যা ঘোষণা করে যে এটি এইচটিটিপিএস অনুরোধটি ফরোয়ার্ড করছে। $request->setTrustedProxies( [ $request->getClientIp() ] );ক্লাউডফ্লেয়ার পাঠাচ্ছে শিরোনামগুলিকে বিশ্বাস করার জন্য আপনার মিডলওয়্যারের আপনাকে অন্য একটি লাইন যুক্ত করতে হবে । এটি পুনঃনির্দেশ লুপ বন্ধ করবে।
অ্যাডাম লিঙ্ক

2
@ মানিক্স দুর্দান্ত এই সপ্তাহে আমার নিজস্ব প্রকল্পটি সহ এইচটিটিপিএস ইস্যুটি সবেমাত্র পেরেছে - এই ছোট্ট জিনিসটি আপনাকে ঘন্টার জন্য হতাশ করবে!
অ্যাডাম লিঙ্ক

8
দুর্দান্ত উত্তর! একটি মাত্র বিশদ: স্থায়ী আন্দোলন যা গুগলকে নির্দেশ করতে 301 পুনর্নির্দেশ ব্যবহার করা আরও ভাল। লাইক:return redirect()->secure($request->getRequestUri(), 301);
অ্যাডেরোচা

4
লোড ব্যালান্সার বা প্রক্সি অধীনে যাদের জন্য সুরক্ষিতভাবে পরিবর্তন করতে পারেন () এটি $request->server('HTTP_X_FORWARDED_PROTO') != 'https'আমার পক্ষে কাজ করে
শিরো

63

একটি অপশন যা আমার পক্ষে কাজ করেছে, অ্যাপসোসাইজপ্রাইভায়ারে কোডটি বুট পদ্ধতিতে রাখুন:

\URL::forceScheme('https');

ফোর্সচেমা ('https') এর আগে লেখা ফাংশনটি ভুল ছিল, এটি ফোর্সস্কিম


16
আরে, সবেমাত্র গুগল করার মাধ্যমে এটি খুঁজে পেয়েছে - নোট করুন যে 5.4\URL::forceScheme('https');
dev

5
একই ফাইলে, আপনি এটিও করতে পারেনif($this->app->environment() === 'production'){ $this->app['request']->server->set('HTTPS', true); }
রোরি

2
আপনার অর্থ কি\URL::forceScheme('https')
আর্নেস্ট ওকোট

17
আমি নিশ্চিত যে এটি কেবলমাত্র লিংক তৈরির জন্য। এটি কোনও ব্যবহারকারীকে https এ জোর করে না, এটি কেবল https: //
ওয়েস্টন ওয়াটসন

হ্যাঁ এটি ঘটেছে @ ওয়েস্টন ওয়াটসন। দয়া করে সমাধানটি যদি পাওয়া যায় তবে ভাগ করুন
হারাট

33

বিকল্পভাবে, আপনি যদি আপাচি ব্যবহার করছেন তবে আপনি .htaccessআপনার ইউআরএলগুলি httpsউপসর্গ ব্যবহারের জন্য প্রয়োগ করতে ফাইল ব্যবহার করতে পারেন । ল্যারাভেল 5.4 এ, আমি আমার .htaccessফাইলে নিম্নলিখিত লাইনগুলি যুক্ত করেছি এবং এটি আমার জন্য কাজ করেছে।

RewriteEngine On

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

2
আপনার সকলের উপর এসএসএল স্থাপনের চেয়ে আপনার যদি একাধিক পরিবেশ (দেব, মঞ্চ, উত্পাদন) থাকে তবে এটি ভাল নয়।
ম্লাদেন জঞ্জেটোভিচ

@ ম্লাদেনজঞ্জেটোভিচ আপনি এটি ব্যবহার করতে ডিভ ব্যবহার করতে পারেন RewriteCond %{HTTP_HOST} !=localhost
ড্যান

3
@ ড্যান - হ্যাঁ, তবে আপনাকে এখনও এটি পর্যায়, স্থানীয় জন্য সেট আপ করতে হবে (এবং যদি ডেভেলপাররা স্থানীয় বিকাশে বিভিন্ন ইউআরএল, যেমন .দেব, .লোকাল, সাবডোমেনস, ... ইত্যাদি ব্যবহার করে থাকে তবে এটি আরও জটিল)। আমি অ্যাপ্লিকেশন এ জাতীয় যুক্তি পছন্দ করতে চাই।
ম্লাদেন জানজেটোভিক

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) এই পরিবর্তনগুলি অ্যাপ্লিকেশন / সরবরাহকারী / অ্যাপসোর্সোপারওয়াইডার.ফ্পে করা উচিত; 2) এটি কেবল এসএসএল ব্যবহারের জন্য অ্যাপের অভ্যন্তরে তৈরি লিঙ্কগুলি সেট করতেই এটি আপনাকে এসএসএল ব্যবহার করতে বাধ্য করে না
ফিনিক্স

হাই, রুটটি এই পদ্ধতি দ্বারা উত্পন্ন হচ্ছে না যদি আমি একটি বোতামটি ক্লিক করি যা আমাকে পরবর্তী রুটে পাঠায় এটি আমাকে ত্রুটি দেয় না 404
সায়েত সিনহা

এটি কোনও https পুনর্নির্দেশ নয়। তবে এটি https: // সাইট পরিবেশন করার অনুমতি দেয়। আপনি যদি এটি http: // এ পরিবর্তন করেন তবে এটি পাশাপাশি পরিবেশন করবে।
ফ্রাঙ্ক

12

ম্যানিক্সের উত্তরের মতো তবে এক জায়গায়। মিডওয়্যারটি এইচটিটিপিএসকে বাধ্য করার জন্য

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

অনুরোধ স্থিতিশীল করা প্রয়োজন?
জিএফএক্সজামাল

@ জে রিশেক সম্ভবত এটি না, তবে দয়া করে উত্তরটি সংশোধন করার চেষ্টা করুন এবং নির্দ্বিধায় বলুন
ম্লাদেন জানজেটোভিক

8

এটি লারাভ 5.2.x এবং এর চেয়ে বড় এর জন্য। আপনি যদি এইচটিটিপিএস এবং এইচটিটিপি-র উপর অন্যদের উপর কিছু সামগ্রী পরিবেশন করার বিকল্প পেতে চান তবে আমার কাছে কাজ করা একটি সমাধান এটি। আপনি ভাবতে পারেন, কেউ এইচটিটিপিএসের মাধ্যমে কেন কেবল কিছু সামগ্রী সরবরাহ করতে চায়? এইচটিটিপিএস-এর মাধ্যমে কেন সব কিছু পরিবেশন করা হচ্ছে না?

যদিও, HTTPS- র মাধ্যমে পুরো সাইটটি পরিবেশন করা সম্পূর্ণ জরিমানা, এইচটিটিপিএস-এর মাধ্যমে সমস্ত কিছু বিচ্ছিন্ন করা আপনার সার্ভারে একটি অতিরিক্ত ওভারহেড রয়েছে। এনক্রিপশন সস্তা আসে না মনে রাখবেন। সামান্য ওভারহেড আপনার অ্যাপ্লিকেশন প্রতিক্রিয়া সময় উপরও প্রভাব ফেলে। আপনি তর্ক করতে পারেন যে পণ্য হার্ডওয়্যারটি সস্তা এবং প্রভাব নগণ্য তবে আমি ডিগ্রি করি :) 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);
    }
}

নোট করুন যে আমি পরিবেশের উপর ভিত্তি করে ফিল্টারিং করছি না কারণ আমার স্থানীয় দেব এবং উত্পাদন উভয়ের জন্যই এইচটিটিপিএস সেটআপ রয়েছে তাই এর দরকার নেই।

আপনার রুটমিলডওয়ার \ অ্যাপ \ এইচটিটিপি \ কার্নেল.এফপিতে নিম্নলিখিতগুলি যুক্ত করুন যাতে আপনি চয়ন করতে পারেন এবং কোন রুট গোষ্ঠীটি এসএসএলকে বাধ্য করতে হবে তা বেছে নিতে পারেন।

    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: // আপনার হোস্ট / লগইন এবং http: // আপনার হোস্ট / অ্যান্টাস রেন্ডার করে

যদি আপনি 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 (এই উত্তরটি লেখার সর্বশেষ সংস্করণ) এর জন্য ব্যবহার করি তবে ল্যার্যাভেল পরিবর্তন হয় বা কিছু কার্যকারিতা সরিয়ে ফেলা হলেও এটি বৈশিষ্ট্য সংস্করণগুলির জন্য কাজ চালিয়ে যাওয়া উচিত।


ক্রোম আমাকে একটি ত্রুটি দেয়: অনেকগুলি পুনর্নির্দেশনা .. মনে হচ্ছে এটি একটি লুপ তৈরি করে
ফিনিক্স

হাই, আমি উত্তর আপডেট করেছি। আপনি প্রকল্পের রুট ডিরেক্টরিতে এই .htaccess রেখেছেন এবং আপনার সার্ভারকে (অ্যাপাচি কনফিগারেশন) প্রজেক্টের রুটে নির্দেশ করে তা নিশ্চিত করুন।
মৌলিক গাঙ্গানি

1
@ ম্লাদেনজঞ্জেটভিচ আপনার এই পরিবেশগুলির জন্য বিভিন্ন htaccess ফাইল থাকতে পারে
বুড়ী

1
@ ম্লাদেনজঞ্জেটোভিচের অ্যাপ্লিকেশনটিতে এটির অবশ্যই রয়েছে এর সুবিধাগুলি, তবে দক্ষতা এবং গতির দৃষ্টিকোণ থেকে আমি বলব যে এটি সার্ভার কনফিগারেশনে থাকা সুবিধাজনক কারণ যাতে আপনাকে কোনও পুনর্নির্দেশের জন্য লারাভেল লোড না করতে হয়। একটি একক সংস্করণ .htaccess এ পরিবেশ-নির্দিষ্ট কনফিগারেশন ডোমেন পরীক্ষা করতে পুনর্লিখন শর্তটি ব্যবহার করে অর্জন করা যেতে পারে, এরকম কিছুRewriteCond %{HTTP_HOST} productiondomain\.com$ [NC]
ক্রিস

1
আমিও এটিকে মূল ডিরেক্টরিতে .htaccess এ স্থাপন করতে পছন্দ করি এবং যেমন ক্রিস বলেছিলেন, পরিবেশ-নির্দিষ্ট সেটিংস এখানে সম্পন্ন করা যেতে পারে, যদিও ম্লেডেনের দ্রবণের চেয়ে কিছুটা কম মার্জিতভাবেই হোক।
জোভান

6

আপনি আপনার সূচিপত্রের সাথে একই ফোল্ডারে এসএসএল জোর করে পুনর্লিখনের ব্যবহার করতে পারেন ph
অনুগ্রহ করে ছবি সংযুক্ত হিসাবে যুক্ত করুন, সমস্ত নিয়মের আগে এটি যুক্ত করুন এসএসএল .htaccess সেট করা


3

ইনডেক্সকন্ট্রোলআরএফপি পুতে

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

        return redirect('/');
    }

    return view('index');
}

অ্যাপসোসভারপ্রভাইডার.এফপি পুস্তকে

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

}

অ্যাপসোর্সোপ্রাইভাইডার.এফপি-তে প্রতিটি পুনঃনির্দেশ ইউআরএল https এ চলে যাবে এবং এইচটিপি অনুরোধের জন্য আমাদের একবারে পুনঃনির্দেশ করা দরকার তাই সূচি নিয়ন্ত্রণকারীআরপিপি-তে কেবল একবার আমাদের পুনঃনির্দেশ করা দরকার


আপনার উত্তর কীভাবে প্রশ্নটির সমাধান করে তা ব্যাখ্যা করতে পারেন?

আপনার উত্তরে দয়া করে এই ব্যাখ্যাটি যুক্ত করুন।

3

উপরের উত্তরগুলি আমার পক্ষে কার্যকর হয়নি তবে ডেনিজ তুরান হিরোকুর বোঝা ভারসাম্যের সাথে কাজ করে এমনভাবে .htaccess পুনরায় লিখেছেন: https://www.jcore.com/2017/01/29/for-https -on-heroku-ব্যবহার-htaccess /

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

3

আমি এই বিকল্পটি যুক্ত করছি কারণ আমি এই সমস্যার সাথে অনেক ভোগ করেছি। আমি সমস্ত বিভিন্ন উপায়ে চেষ্টা করেছি এবং কিছুই কার্যকর হয়নি। সুতরাং, আমি এটির জন্য একটি কর্মসূচী নিয়ে এসেছি। এটি সেরা সমাধান নাও হতে পারে তবে এটি কাজ করে -

এফওয়াইআই, আমি লারাভেল 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

আপনি যদি ক্লাউডফ্লেয়ার ব্যবহার করছেন তবে আপনি সর্বদা এইচটিটিপিএস ব্যবহার করার জন্য একটি পৃষ্ঠা বিধি তৈরি করতে পারেন: জোর করে এসএসএল ক্লাউডফ্লেয়ার করুন এটি প্রতিটি http: // অনুরোধটিকে https: // এ পুনঃনির্দেশ করবে

এটির পাশাপাশি, আপনাকে আপনার \ অ্যাপ \ সরবরাহকারী \ অ্যাপসোসিয়েশনপ্রভাইডার.এফপি বুট () ফাংশনেও এর মতো কিছু যুক্ত করতে হবে:

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

এটি নিশ্চিত করবে যে আপনার অ্যাপ্লিকেশনটির প্রতিটি লিঙ্ক / পাথ http: // এর পরিবর্তে https: // ব্যবহার করছে।


2

সামান্য ভিন্ন পদ্ধতির, লারাভেল ৫.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);
    }
}

পুনশ্চ. @ ম্যাথিয়াস-লিলের মন্তব্যের ভিত্তিতে কোড আপডেট হয়েছে।


1
লারাভেল 6 এও কাজ করে।
রুবেন্স

1
env () ফাংশনগুলি ব্যবহার করা ক্যাশেড কনফিগারেশন ফাইলগুলির সাথে কাজ করবে না। এটি config('app.url')পরিবর্তে নির্দেশ করা উচিত । এছাড়াও, লারাভেল একটি খুব সহজ স্ট্রিং ফাংশন নিয়ে আসে Str::startsWith(config('app.url'), 'https://')
ম্যাথিয়াস লিল

1

লারাভেল ৫..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
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

আমি পরবর্তী মিডওয়্যারের লারাভেল 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

আপনি অ্যাপ্লিকেশনগুলিতে সহজে যেতে পারেন -> সরবরাহকারী -> অ্যাপসোর্সোপারওয়াইডার.এফপি

দুটি লাইন যুক্ত করুন

আলোকসজ্জা \ সহায়তা \ মুখোমুখি \ ইউআরএল ব্যবহার করুন;

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ফাইল ব্যবহার করতে পছন্দ করেন তবে আপনি নীচের কোডটি ব্যবহার করতে পারেন:

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

শুভেচ্ছা সহ!

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.