.Htaccess এবং মোড_উরাইট ব্যবহার করে এসএসএল / https জোর করে


উত্তর:


438

অ্যাপাচি-র জন্য, আপনি mod_sslএসএসএলকে এর সাথে জোর করে ব্যবহার করতে পারেন SSLRequireSSL Directive:

এই নির্দেশিকাটি এসএসএল-এর (যেমন HTTPS) বর্তমান সংযোগের জন্য সক্ষম না করা অবধি অ্যাক্সেস নিষিদ্ধ করে। এটি এসএসএল-সক্ষম সক্ষম ভার্চুয়াল হোস্ট বা ডিরেক্টরিতে সুরক্ষিত হওয়া উচিত এমন স্টাফগুলি প্রকাশ করে যে কনফিগারেশন ত্রুটিগুলির বিরুদ্ধে রক্ষা করার জন্য এটি খুব সহজ। যখন এই নির্দেশিকা উপস্থিত থাকে তখন সমস্ত অনুরোধগুলি অস্বীকার করা হয় যা এসএসএল ব্যবহার করছে না।

এটি যদিও https এ পুনর্নির্দেশ করবে না। পুনঃনির্দেশ করতে, mod_rewriteআপনার .htaccess ফাইলটিতে নিম্নলিখিত ব্যবহার করে দেখুন

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

বা দেওয়া বিভিন্ন পদ্ধতির যে কোনও

আপনার সরবরাহকারী .htaccess অক্ষম করে রাখার ক্ষেত্রেও আপনি পিএইচপি-র মধ্যে থেকে এটি সমাধান করতে পারেন (আপনি এটি জিজ্ঞাসা করার পরে এটি অসম্ভব, তবে যাইহোক)

if (!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] !== 'on') {
    if(!headers_sent()) {
        header("Status: 301 Moved Permanently");
        header(sprintf(
            'Location: https://%s%s',
            $_SERVER['HTTP_HOST'],
            $_SERVER['REQUEST_URI']
        ));
        exit();
    }
}

1
এটি আমাদের পরিস্থিতিতে দুর্দান্ত কারণ আমাদের কাছে বর্তমানে http এবং https ট্র্যাফিকের মিশ্রণ রয়েছে। আমাদের অ্যাডমিন অঞ্চলের জন্য আমরা সাইটটির বাকি অংশটি http রাখার সময় .htaccess স্ক্রিপ্টে পপ করেছি।
মাইকেল জে। ক্যালকিনস

1
আমি যখন মোড_উইরাইট পদ্ধতিটি ব্যবহার করি তখন আমি https এ প্রেরণ করব তবে একটি "পৃষ্ঠা সঠিকভাবে পুনঃনির্দেশ দিচ্ছে না" ত্রুটিযুক্ত।
Cz প্রযুক্তি

11
ফলোআপ: আপনার যদি অনুরূপ সমস্যা হয় তবে আপনার সার্ভার এবং এইচটিটিপি ভেরিয়েবলগুলি পরীক্ষা করুন। যদি আপনার সার্ভার প্রক্সি ব্যবহার করে, আপনি এসএসএল চালু আছে কিনা তা পরীক্ষা করতে আপনি ব্যবহার করতে পারেন %{HTTP:X-Forwarded-Proto}বা %{HTTP:X-Real-Port}ভেরিয়েবলগুলি ব্যবহার করতে চাইতে পারেন ।
সজেকনোলজি

8
যদি আপনি প্রক্সিগুলির পিছনে চলমান সার্ভারগুলিতে পুনর্নির্দেশের লুপগুলি ( ক্লাউডফ্লেয়ার , ওপেনশিফ্ট ) অনুভব করেন তবে এমন একটি সমাধানের জন্য এই উত্তরটি দেখুন যা সে ক্ষেত্রেও কাজ করে।
রাফাইনস

4
@ জিটোডোরভ - স্থান সরিয়ে নেওয়া আমার জন্য পুনরায় লেখককে ভেঙে দিয়েছে। পুনরায় লেখক সম্পর্কে আমার (সীমাবদ্ধ) জ্ঞান থেকে সিনট্যাক্সটি RewriteRule <input-pattern> <output-url>। সুতরাং, স্থানটি সেখানে থাকা দরকার, এবং একক ^কেবল "সমস্ত ইনপুট ইউআরএল মেলে" বলে।
স্পিনএক্সএক্সএক্সএক্স

54

আমি এমন একটি mod_rewriteসমাধান খুঁজে পেয়েছি যা প্রক্সিড এবং অপ্রক্সাইড সার্ভার উভয়ের জন্যই ভাল কাজ করে।

আপনি যদি ক্লাউডফ্লেয়ার, এডাব্লুএস ইলাস্টিক লোড ব্যালেন্সিং, হেরোকু, ওপেনশিফ্ট বা অন্য কোনও ক্লাউড / প্যাস সলিউশন ব্যবহার করছেন এবং আপনি সাধারণ এইচটিটিপিএস পুনঃনির্দেশের সাহায্যে পুনঃনির্দেশ লুপগুলি অনুভব করছেন তবে পরিবর্তে নিম্নলিখিত স্নিপেট ব্যবহার করে দেখুন।

RewriteEngine On

# If we receive a forwarded http request from a proxy...
RewriteCond %{HTTP:X-Forwarded-Proto} =http [OR]

# ...or just a plain old http request directly from the client
RewriteCond %{HTTP:X-Forwarded-Proto} =""
RewriteCond %{HTTPS} !=on

# Redirect to https version
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

এটি উজ্জ্বল থেক্স! তবে কি পোস্ট শর্ত যুক্ত করা দরকার? RewritCond% {REQUEST_METHOD}!
O

@ আলেকসেজ সত্য, এটি এনক্রিপ্ট করা পোষ্টের অনুরোধগুলি ভেঙে দেয়। তবে আমি মনে করি এটি একটি ভাল জিনিস। এইভাবে লোকেরা লক্ষ্য করবে যে তারা কিছু ভুল করছে। আমি অনুমান করি যে সবচেয়ে ভাল জিনিসটি হ'ল এটিকে একটি পৃষ্ঠায় পুনর্নির্দেশ করা যা আপনার পরিষেবাটি কীভাবে সঠিকভাবে ব্যবহার করতে হয় সে সম্পর্কে তাদের অবহিত করে।
রাফাইনস

@raphinesse আপনি কি এই প্রশ্নের উত্তর জানেন: স্ট্যাকওভারফ্লো / প্রশ্ন / 19১৯৫১০৮২/২
আরআরএন

36

পিএইচপি সমাধান

গর্ডনের খুব বিস্তৃত উত্তর থেকে সরাসরি orrowণ নেওয়া, আমি নোট করব যে আপনার প্রশ্নে এইচটিটিপিএস / এসএসএল সংযোগগুলি বাধ্য করার ক্ষেত্রে পৃষ্ঠা-নির্দিষ্ট থাকার কথা উল্লেখ করা হয়েছে।

function forceHTTPS(){
  $httpsURL = 'https://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
  if( count( $_POST )>0 )
    die( 'Page should be accessed with HTTPS, but a POST Submission has been sent here. Adjust the form to point to '.$httpsURL );
  if( !isset( $_SERVER['HTTPS'] ) || $_SERVER['HTTPS']!=='on' ){
    if( !headers_sent() ){
      header( "Status: 301 Moved Permanently" );
      header( "Location: $httpsURL" );
      exit();
    }else{
      die( '<script type="javascript">document.location.href="'.$httpsURL.'";</script>' );
    }
  }
}

তারপরে, এই পৃষ্ঠাগুলির শীর্ষে যতই আপনি পিএইচপি এর মাধ্যমে সংযোগ করতে বাধ্য করতে চান, আপনি require()এই (এবং অন্য কোনও) কাস্টম ফাংশন সমন্বিত একটি কেন্দ্রীয় ফাইল করতে পারেন এবং তারপরে কেবল forceHTTPS()ফাংশনটি চালাতে পারেন ।

এইচটিএসিসিএসিএসসি / মোড_উরাইট সলিউশন

আমি এই ধরণের সমাধানটি ব্যক্তিগতভাবে প্রয়োগ করি নি (পিএইচপি সমাধানটি আমি সরলতার জন্য উপরের মতোই ব্যবহার করেছি), তবে নিম্নলিখিতগুলি অন্তত একটি ভাল শুরু হতে পারে।

RewriteEngine on

# Check for POST Submission
RewriteCond %{REQUEST_METHOD} !^POST$

# Forcing HTTPS
RewriteCond %{HTTPS} !=on [OR]
RewriteCond %{SERVER_PORT} 80
# Pages to Apply
RewriteCond %{REQUEST_URI} ^something_secure [OR]
RewriteCond %{REQUEST_URI} ^something_else_secure
RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]

# Forcing HTTP
RewriteCond %{HTTPS} =on [OR]
RewriteCond %{SERVER_PORT} 443
# Pages to Apply
RewriteCond %{REQUEST_URI} ^something_public [OR]
RewriteCond %{REQUEST_URI} ^something_else_public
RewriteRule .* http://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]

কৌতূহলের বাইরে, কেন RewriteCond %{REQUEST_METHOD} !^POST$?
Depoulo

12
কারণ POST প্যারামিটারগুলি পুনর্নির্দেশে রাখা হয় না। আপনি যদি সমস্ত পোষ্ট জমাটি সুরক্ষিত থাকে তা নিশ্চিত করতে চান তবে আপনি কোনও লাইন বাদ দিতে পারেন (কোনও সুরক্ষিত পোস্ট পোস্ট জমা দেওয়া হবে না)।
লুক স্টিভেনসন

@ লুচানোস - কীভাবে এমন একটি রাইরাইটকন্ড লিখবেন যা পোষ্টের সময় কোনও HTTP বা https- এ পুনর্নির্দেশকে বাধ্য করে না? আমার .htaccess নির্দিষ্ট সুনির্দিষ্ট পৃষ্ঠাগুলিতে এইচটিটিপিএসকে জোর করে এবং তারপরে বাকী অংশে এইচটিটিপিকে বাধ্য করে। তবে এইচটিটিপিএস পৃষ্ঠাগুলিতে এমন কিছু ফর্ম রয়েছে যা আমার ওয়েবের মূলতে জমা দেয়। ফর্মটি HTTPS হিসাবে ক্রিয়া url নির্দিষ্ট করে। তবে যেহেতু ওয়েব রুট এইচটিটিপিএসকে বাধ্য করার জন্য নির্দিষ্ট করা পৃষ্ঠাগুলির মধ্যে একটি নয়, তাই আমার .htaccess একটি পুনর্নির্দেশকে বাধ্য করে - যার অর্থ পিওএসটি ভেরিয়েবলগুলি হারিয়ে যায়। আমি কীভাবে পোস্টে পুনঃনির্দেশগুলি প্রতিরোধ করব?
স্ট্যাকওভারফ্লো নিউবি

1
@ স্ট্যাকওভারফ্লো নিউইউবি: RewriteCond %{REQUEST_METHOD} !^POST$এই পুনঃনির্দেশগুলি দ্বারা লাইনটির পোস্টের জমাগুলি আটকানো উচিত।
লুক স্টিভেনসন

আমি এই পিএইচপি সংস্করণ পছন্দ। এটি একটি পোষ্ট হিসাবে বিবেচিত হওয়ার সাথে সাথে শিরোনামগুলি ইতিমধ্যে প্রেরণ করা থাকলে এটি আরও ভাল পরিচালনা করে much
TheStoryCoder

10

মোড-পুনর্লিখন ভিত্তিক সমাধান:

এইচটিসেসিতে নিম্নলিখিত কোডটি ব্যবহার করে সমস্ত HTTP অনুরোধগুলি স্বয়ংক্রিয়ভাবে https এ ফরোয়ার্ড করে।

RewriteEngine on

RewriteCond %{HTTPS}::%{HTTP_HOST} ^off::(?:www\.)?(.+)$
RewriteRule ^ https://www.%1%{REQUEST_URI} [NE,L,R]

এটি আপনার অ-www এবং www HTTP অনুরোধগুলিকে https এর www সংস্করণে পুনর্নির্দেশ করবে ।

আরেকটি সমাধান (অ্যাপাচি ২.৪ *)

RewriteEngine on

RewriteCond %{REQUEST_SCHEME}::%{HTTP_HOST} ^http::(?:www\.)?(.+)$
RewriteRule ^ https://www.%1%{REQUEST_URI} [NE,L,R]

এটি% ache REQUEST_SCHEME as ভেরিয়েবলটি ২.৪-এর পরে মোড-রাইরাইটে যুক্ত হয়েছিল বলে অ্যাপাচি-র নিম্ন সংস্করণগুলিতে কাজ করে না।


9

আমি কেবল এটি উল্লেখ করতে চাই যে ডিরেক্টরি গভীরতায় জুড়ে একাধিক .htaccess ফাইল ব্যবহার করার সময় অ্যাপাচি- র সবচেয়ে খারাপ উত্তরাধিকারের নিয়ম রয়েছে। দুটি মূল সমস্যা:

  • গভীরতম .htaccess ফাইলে থাকা নিয়মগুলি কেবল ডিফল্টরূপে সম্পাদিত হবে। এটি RewriteOptions InheritDownBeforeপরিবর্তন করতে আপনাকে অবশ্যই নির্দেশিকা (বা অনুরূপ) নির্দিষ্ট করতে হবে। (প্রশ্ন দেখুন)
  • প্যাটার্নটি উপ-ডিরেক্টরি সম্পর্কিত ফাইলের পথে প্রয়োগ করা হয় এবং প্রদত্ত নিয়মটি সহ .htaccess ফাইল ধারণকারী উচ্চ ডিরেক্টরিতে নয়। (আলোচনা দেখুন)

এর অর্থ যদি আপনি সাব ডিরেক্টরিতে অন্য কোনও .htaccess ফাইল ব্যবহার করেন তবে অ্যাপাচি উইকিতে প্রস্তাবিত বৈশ্বিক সমাধান কাজ করে না । আমি একটি পরিবর্তিত সংস্করণ লিখেছি যা এতে করে:

RewriteEngine On
# This will enable the Rewrite capabilities

RewriteOptions InheritDownBefore
# This prevents the rule from being overrided by .htaccess files in subdirectories.

RewriteCond %{HTTPS} !=on
# This checks to make sure the connection is not already HTTPS

RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [QSA,R,L]
# This rule will redirect users from their original location, to the same location but using HTTPS.
# i.e.  http://www.example.com/foo/ to https://www.example.com/foo/

0

সহজ এবং সহজ, কেবল নিম্নলিখিত যুক্ত করুন

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

পুরো ইন্টারনেট জুড়ে লোকে আপনাকে https জোর করার জন্য যা করতে বলেছে এটি এটি বেশ সুন্দর। তবে, যতবার আমি এটি করি, আমার পুরো ওয়েবসাইটটি ফরবিডেন হয়ে যায় বা আপনার দেখার অনুমতি নেই। এরকম কিছু ... আমি কী ভুল করছি? আমি কেবল এই বিষয়ে একটি প্রশ্ন পোস্ট করার আগে আপনার কোনও ধারণা আছে কিনা তা জানতে চাই।
ThN

আমারও একই সমস্যা ছিল এবং আমাকে https.conf ফাইলে নিয়মগুলি প্রয়োগ করতে হয়েছিল। আমার উত্তর নীচে দেখুন।
রিস্টার্ড

-1

এই কোডটি আমার পক্ষে কাজ করে

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP:X-HTTPS} !1
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

-1

সাধারণ একটি:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www\.example\.com)(:80)? [NC]
RewriteRule ^(.*) https://example.com/$1 [R=301,L]
order deny,allow

আপনার ইউআরএলকে উদাহরণ.কমের সাথে প্রতিস্থাপন করুন


না! সাইটের ইউআরএলটি গতিশীল হওয়া দরকার।
আমির সাভান্দ

-1

শুধুমাত্র অ্যাপাচি .htaccess সহ এসএসএলকে বাধ্য করার জন্য আপনি ব্যবহার করতে পারেন

SSLOptions +StrictRequire
SSLRequireSSL

পুনর্নির্দেশের জন্য উপরের উত্তরটি সঠিক


-1

এই কোডটি ব্যবহার করে দেখুন, এটি URL এর মতো সমস্ত সংস্করণের জন্য কাজ করবে

  • website.com
  • www.website.com
  • http://website.com
  • http://www.website.com

    RewriteCond %{HTTPS} off
    RewriteCond %{HTTPS_HOST} !^www.website.com$ [NC]
    RewriteRule ^(.*)$ https://www.website.com/$1 [L,R=301]
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.