2008-09-17 13 views
113

मुझे केवल एक पृष्ठ मिला है जिसे मैं एक HTTPS पृष्ठ (अपाचे पर PHP) के रूप में एक्सेस करने के लिए मजबूर करना चाहता हूं। मैं पूरी निर्देशिका को HTTPS की आवश्यकता के बिना ऐसा कैसे करूं? या, यदि आप HTTP पृष्ठ से किसी HTTPS पृष्ठ पर कोई फ़ॉर्म सबमिट करते हैं, तो क्या यह HTTP के बजाय HTTPS द्वारा भेजता है?मैं उपयोगकर्ताओं को HTTP के बजाय HTTPS पर अपने पृष्ठ तक पहुंचने के लिए कैसे मजबूर कर सकता हूं?

http://www.example.com/some-page.php 

मैं इसे केवल के माध्यम से पहुँचा जा करना चाहते हैं:

यहाँ मेरी उदाहरण है

https://www.example.com/some-page.php 

ज़रूर, मैं HTTPS संस्करण की दिशा में रखे इस पेज के लिंक के सभी डाल सकते हैं, लेकिन यह है कि उद्देश्य पर HTTP के माध्यम से पहुँचने से कुछ मूर्ख नहीं रुकती ...

एक बात मैंने सोचा था कि PHP फ़ाइल के शीर्षक में एक रीडायरेक्ट डाल दिया गया था कि वे accessin कर रहे हैं होने के लिए जाँच करने के लिए जी HTTPS वर्शन:

if($_SERVER["SCRIPT_URI"] == "http://www.example.com/some-page.php"){ 
    header('Location: https://www.example.com/some-page.php'); 
} 

लेकिन वह सही तरीके से नहीं किया जा सकता है, यह कर सकते हैं?

बीटीडब्ल्यू, कृपया यूआरएल पर ध्यान न दें। मुझे पता है कि अगर यह वास्तव में एक पृष्ठ था जहां एक शॉपिंग कार्ट था, तो आप इसे एक अलग तरीके से करेंगे। इसे उस साइट के एक पृष्ठ के रूप में सोचें जो एक आइटम को एक कीमत के लिए बेचता है जहां आप अपनी क्रेडिट कार्ड जानकारी में टाइप करते हैं, ताकि आप अपने कार्ड को चार्ज करने के व्यक्त उद्देश्य के लिए बाहरी साइट पर भुगतान गेटवे में जमा कर सकें।

+0

संभावित डुप्लिकेट [फोर्स एसएसएल/https का उपयोग .htaccess और mod \ _rewrite] (http://stackoverflow.com/questions/4398951/force-ssl-https-using-htaccess-and-mod-rewrite) – Trilarion

+1

क्या कोई है कारण आपको सभी पृष्ठों के लिए एसएसएल की आवश्यकता क्यों नहीं है? –

उत्तर

44

आप एक निर्देश और अपाचे पर mod_rewrite के साथ यह कर सकता है:

<Location /buyCrap.php> 
RewriteEngine On 
RewriteCond %{HTTPS} off 
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} 
</Location> 

आप regular expressions का उपयोग कर अगर आप चाहते हैं स्थान समय के साथ होशियार बना सकता है।

+6

आप इसे कहां रखेंगे? .htaccess फ़ाइल? –

+1

REQUEST_URI में "क्वेरी स्ट्रिंग" शामिल नहीं है (जैसे? पृष्ठ = 1 और आईडी = 41 आदि)? कि क्या अपाचे प्रलेखन कहते हैं ... तो अगर मैं http://site.com/index.php?page=1&id=12 तक पहुँचने का प्रयास मैं पुनः निर्देशित किया जाएगा https://site.com/index.php – Rolf

+2

से अपाचे प्रलेखन: REQUEST_URI अनुरोधित यूआरआई के पथ घटक, इस तरह के "/index.html" के रूप में। यह विशेष रूप से क्वेरी स्ट्रिंग को बहिष्कृत करता है जो QUERY_STRING नामक अपने स्वयं के चर के रूप में उपलब्ध है। तो आपको REQUEST_URI – Rolf

3

$_SERVER['HTTPS'] का उपयोग यह बताने के लिए करें कि यह SSL है, और यदि सही नहीं है तो सही जगह पर रीडायरेक्ट करें।

और याद रखें, पेज उस रूप को प्रदर्शित करता है HTTPS के माध्यम से खिलाया जा करने की जरूरत नहीं है, यह पद वापस यूआरएल यह सबसे की जरूरत है कि है।

संपादित करें: हाँ, जैसा कि नीचे बताया गया है, एचटीटीपीएस में पूरी प्रक्रिया होना सर्वोत्तम है। यह बहुत अधिक आश्वस्त है - मैं यह इंगित कर रहा था कि पोस्ट सबसे महत्वपूर्ण हिस्सा है। साथ ही, आपको यह ध्यान रखना होगा कि किसी भी कुकी को सुरक्षित होने के लिए सेट किया गया है, इसलिए उन्हें केवल SSL के माध्यम से भेजा जाएगा। Mod_rewrite समाधान भी बहुत निफ्टी है, मैंने इसे अपनी वेबसाइट पर बहुत सारे एप्लिकेशन सुरक्षित करने के लिए उपयोग किया है।

+0

यह सच है कि फ़ॉर्म को https होने की आवश्यकता नहीं है, हालांकि यह एक अच्छा विचार है अधिकांश लोग जो इसे नहीं जानते हैं। अगर वे फॉर्म जमा करने वाले हैं और ध्यान दें कि लॉक आइकन वहां नहीं है, तो वे गलती से मान सकते हैं कि फॉर्म असुरक्षित है। –

+1

@Graeme: इसके अतिरिक्त कोई भी शर्मिंदा नहीं हो सकता है कि फॉर्म कभी भी https के माध्यम से भेजा जाएगा। पूरा फॉर्म (http के माध्यम से प्रदर्शित) एक नकली हो सकता है, जो अज्ञात या http cleartext साइट पर सबमिट कर रहा है। एचटीपीएस सिर्फ एन्क्रिप्शन के बारे में नहीं है, यह सर्वर को प्रमाणित करता है। –

150

तरह से मैं इसे पहले किया है मूल रूप से आप क्या लिखा है की तरह है, लेकिन किसी भी हार्डकोडेड मान नहीं है:

if($_SERVER["HTTPS"] != "on") 
{ 
    header("Location: https://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]); 
    exit(); 
}
+14

रीडायरेक्ट के बाद स्क्रिप्ट छोड़ने के लिए आप निकास() को कॉल करना भूल गए हैं। मैं आमतौर पर requSSL() नामक फ़ंक्शन में लपेटता हूं। मैं इसे किसी भी पेज के शीर्ष पर कॉल कर सकता हूं जिसे मैं एन्क्रिप्ट करना चाहता हूं। –

+24

PHP नोटिस को ठीक करने के लिए '(खाली ($ _ सर्वर [" HTTPS "]) $ _SERVER [" HTTPS "]! ==" चालू ") को बदलें। – dave1010

+0

'$ _SERVER [] 'चर बदलने योग्य/उपयोगकर्ता हस्तक्षेप के लिए कमजोर नहीं हैं? –

1

एक ही पृष्ठ पर HTTP और HTTPS मिश्रण मत करो। यदि आपके पास एक फॉर्म पेज है जो HTTP के माध्यम से पेश किया गया है, तो मैं डेटा सबमिट करने के बारे में परेशान होने जा रहा हूं - मैं नहीं देख सकता कि सबमिट स्रोत स्रोत के बिना एचटीटीपीएस या HTTP पर जाता है या नहीं।

सबमिट लिंक के साथ HTTPS पर फ़ॉर्म की सेवा करना लाभ के लिए भारी परिवर्तन नहीं है।

0

आपको सुरक्षा कारणों से नहीं होना चाहिए। विशेष रूप से यदि कुकीज़ यहां खेल रहे हैं। यह आपको कुकी-आधारित रीप्ले हमलों के लिए व्यापक रूप से खुला छोड़ देता है।

किसी भी तरह से, आपको इसे ट्यून करने के लिए अपाचे नियंत्रण नियमों का उपयोग करना चाहिए।

फिर आप HTTPS सक्षम होने के लिए परीक्षण कर सकते हैं और आवश्यकतानुसार आवश्यकतानुसार रीडायरेक्ट कर सकते हैं।

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

http://joseph.randomnetworks.com/archives/2004/07/22/redirect-to-ssl-using-apaches-htaccess/

एक अच्छी जगह अधिक प्रदान नहीं करने के लिए शुरू करने के लिए, क्षमा याचना है। लेकिन आप वास्तव में एसएसएल के माध्यम से सबकुछ फेंकना चाहिए।

यह अधिक सुरक्षात्मक है, लेकिन कम से कम आपको कम चिंताएं हैं।

8
// Force HTTPS for security 
if($_SERVER["HTTPS"] != "on") { 
    $pageURL = "Location: https://"; 
    if ($_SERVER["SERVER_PORT"] != "80") { 
     $pageURL .= $_SERVER["SERVER_NAME"] . ":" . $_SERVER["SERVER_PORT"] . $_SERVER["REQUEST_URI"]; 
    } else { 
     $pageURL .= $_SERVER["SERVER_NAME"] . $_SERVER["REQUEST_URI"]; 
    } 
    header($pageURL); 
} 
35

आप HTTPS HTTP Strict Transport Security (HSTS) हेडर के साथ हमेशा के लिए अनुरोध करने ग्राहक मजबूर करना चाहिए:

// Use HTTP Strict Transport Security to force client to use secure connections only 
$use_sts = true; 

// iis sets HTTPS to 'off' for non-SSL requests 
if ($use_sts && isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') { 
    header('Strict-Transport-Security: max-age=31536000'); 
} elseif ($use_sts) { 
    header('Location: https://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'], true, 301); 
    // we are in cleartext at the moment, prevent further execution and output 
    die(); 
} 

कृपया ध्यान दें कि HSTS अधिकांश आधुनिक ब्राउज़र में समर्थित है, लेकिन सार्वभौमिक नहीं। इस प्रकार ऊपर दिए गए तर्क मैन्युअल रूप से समर्थन पर ध्यान दिए बिना उपयोगकर्ता को रीडायरेक्ट करते हैं, और फिर एचएसटीएस हेडर सेट करते हैं ताकि यदि संभव हो तो ब्राउज़र द्वारा आगे के क्लाइंट अनुरोधों को रीडायरेक्ट किया जाना चाहिए।

+0

मुझे आश्चर्य है कि अन्य उत्तरों में से कोई भी इस हेडर को शामिल नहीं करता है, यह काफी महत्वपूर्ण है ... उनमें से दो के संयोजन के लिए कोई नुकसान? – keisar

+0

नहीं ... अगर आप हमेशा HTTPS चाहते हैं तो आप निश्चित रूप से उस शीर्षलेख को सेट कर सकते हैं। रीडायरेक्ट करने से पहले और इसे सेट करने के लिए यह केवल अनावश्यक है। मैंने संगतता की अधिक सटीक व्याख्या करने के लिए उपरोक्त मेरी प्रतिक्रिया में भी संशोधन किया है। –

+1

(मूल टिप्पणी को पुन: सक्रिय करना) मैंने "केवल एक पृष्ठ" की विशिष्ट आवश्यकता को नहीं देखा। एचएसटीएस सभी पृष्ठों पर लागू होगा; मेरा जवाब तकनीकी रूप से गलत है। –

5

http://www.besthostratings.com/articles/force-ssl-htaccess.html

कभी-कभी आप सुनिश्चित करें कि उपयोगकर्ता securte कनेक्शन पर अपनी साइट ब्राउज़ कर रहा है बनाने के लिए आवश्यकता हो सकती है। ,

RewriteEngine On 
RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ https://www.example.com/$1 [R,L] 

कृपया ध्यान दें कि .htaccess में स्थित होना चाहिए: निम्नलिखित एक .htaccess युक्त फ़ाइल के साथ पूरा किया जा सकता लाइनों: जिस तरह से करने के लिए एक आसान हमेशा सुरक्षित करने के लिए कनेक्शन (https: //) उपयोगकर्ता रीडायरेक्ट करने के लिए वेब साइट मुख्य फ़ोल्डर।

मामले में आप आप उपयोग कर सकते हैं एक विशेष फ़ोल्डर के लिए HTTPS को बलपूर्वक लागू करना चाहते हैं:

RewriteEngine On 
RewriteCond %{SERVER_PORT} 80 
RewriteCond %{REQUEST_URI} somefolder 
RewriteRule ^(.*)$ https://www.domain.com/somefolder/$1 [R,L] 

.htaccess फाइल फोल्डर जहां HTTPS को बलपूर्वक लागू करने की जरूरत है में रखा जाना चाहिए।

-3
<?php 
// Require https 
if ($_SERVER['HTTPS'] != "on") { 
    $url = "https://". $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI']; 
    header("Location: $url"); 
    exit; 
} 
?> 

यह आसान है।

+1

डुप्लिकेट उत्तर –

6

लोड बैलेंसर के पीछे चलते समय ऐसा कुछ करना था। Hat टिप https://stackoverflow.com/a/16076965/766172

function isSecure() { 
    return (
     (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') 
    || $_SERVER['SERVER_PORT'] == 443 
    || (
      (!empty($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') 
     || (!empty($_SERVER['HTTP_X_FORWARDED_SSL']) && $_SERVER['HTTP_X_FORWARDED_SSL'] == 'on') 
     ) 
    ); 
} 

function requireHTTPS() { 
    if (!isSecure()) { 
     header('Location: https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'], TRUE, 301); 
     exit; 
    } 
} 
4

ठीक है .. अब इस पर सामान के टन है, लेकिन कोई भी वास्तव में "सुरक्षित" सवाल पूरा करती है। मेरे लिए यह असुरक्षित कुछ ऐसा उपयोग करने के लिए हास्यास्पद है।

जब तक आप इसका उपयोग चारा के रूप में नहीं करते।

$ _SERVER प्रचार किसी ऐसे व्यक्ति की इच्छा पर बदला जा सकता है जो जानता है कि कैसे।

साथ ही साथ सज़ाद तुषार खान और थेबिगजेक ने कहा कि आप इसे करने के लिए प्रोजेक्टैकिस का भी उपयोग कर सकते हैं और इसमें बहुत सारे उत्तर हैं।

बस जोड़ें:

RewriteEngine On 
RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ https://example.com/$1 [R,L] 

क्या आप अपने .httaccess में और है कि thats है के अंत में।

फिर भी हम सुरक्षित नहीं हैं क्योंकि हम संभवतः इन 2 उपकरणों के साथ हो सकते हैं।

शेष सरल है। अगर वहाँ याद कर रहे हैं जिम्मेदार बताते हैं यानी ...

if(empty($_SERVER["HTTPS"])){ // SOMETHING IS FISHY 
} 

if(strstr($_SERVER['HTTP_HOST'],"mywebsite.com") === FALSE){// Something is FISHY 
} 


भी कहते हैं कि तुम अपने httaccess फ़ाइल को अद्यतन किया है और आप की जाँच करें:

if($_SERVER["HTTPS"] !== "on"){// Something is fishy 
} 

एक बहुत अधिक चर रहे हैं आप जाँच कर सकते हैं यानी ..

HOST_URI(यदि चेक करने के लिए इसके बारे में स्थिर गुण हैं)

HTTP_USER_AGENT(एक ही सत्र विभिन्न मूल्यों)

तो सब इम कहावत न जब जवाब एक संयोजन में निहित है सिर्फ एक या अन्य के लिए समझौता है।

अधिक httaccess पुनर्लेखन जानकारी के लिए यहाँ docs->http://httpd.apache.org/docs/2.0/misc/rewriteguide.html

कुछ ढेर देखना ->Force SSL/https using .htaccess and mod_rewrite
और
Getting the full URL of the current page (PHP)
एक जोड़ी नाम है।

+2

लेकिन अब मुझे निम्न त्रुटि मिलती है: 'ERR_TOO_MANY_REDIRECTS'। मैं यह कैसे तय करुं? – Pathros

11

मैं सिर्फ एक .htaccess फाइल बनाया है और कहा:

RewriteEngine On 
RewriteCond %{HTTPS} off 
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} 

सरल!

-1

मैंने इस स्क्रिप्ट का उपयोग किया है और यह साइट के माध्यम से अच्छी तरह से काम करता है।

if(empty($_SERVER['HTTPS']) || $_SERVER['HTTPS'] == "off"){ 
    $redirect = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; 
    enter code hereheader('HTTP/1.1 301 Moved Permanently'); 
    header('Location: ' . $redirect); 
    exit(); 
} 
0

आप अपाचे या LiteSpeed ​​की तरह कुछ है, जो .htaccess फ़ाइलों का समर्थन करता उपयोग करते हैं, आप निम्न कर सकते हैं। यदि आपके पास पहले से कोई .htaccess फ़ाइल नहीं है, तो आपको अपनी रूट निर्देशिका में एक नई। Htaccess फ़ाइल बनाना चाहिए (आमतौर पर जहां आपका index.php स्थित है)।

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

आप केवल शिक्षा की जरूरत है "RewriteEngine पर" सभी पुनर्लेखन नियमों के लिए अपने .htaccess में एक बार, आप पहले से ही यह किया है, बस कॉपी इसलिए अब अपनी .htaccess में पहली पुनर्लेखन नियम के रूप में इन पंक्तियों को जोड़ने दूसरी और तीसरी पंक्ति।

मुझे उम्मीद है कि इससे मदद मिलती है।

+1

कृपया अपने डाउनवोट, यादृच्छिक इंटरनेट अजनबी को समझाएं। –

+0

यह मेरे लिए काम करता है और जो मैं अपनी स्क्रिप्ट में ज़ेंड 2-जैसी फ्रेमवर्क पर उपयोग कर रहा हूं - मुझे डाउनवोट समझ में नहीं आता है। – Antonio

+0

हो सकता है कि आप डाउनवॉटेड हो जाएं क्योंकि इसका जवाब लगभग एक जैसा है [http://stackoverflow.com/a/31000510/1697459) @MatHatrik से जो एक साल पहले पोस्ट किया गया था? – Wilt

1

इस का उपयोग करते हुए पर्याप्त नहीं है:

if($_SERVER["HTTPS"] != "on") 
{ 
    header("Location: https://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]); 
    exit(); 
} 

आप किसी भी http सामग्री (एक बाहरी http छवि स्रोत की तरह) है, तो ब्राउज़र एक संभावित खतरे की पहचान करेगा। तो सुनिश्चित करें कि आपके सभी रेफरी और अपने कोड के अंदर src हो रहे हैं https

0

मैं $ _SERVER [HTTPS] की स्थिति जांचने के साथ कई समाधान के माध्यम से किया गया है, लेकिन लगता है है जैसे कि यह विश्वसनीय नहीं है क्योंकि कभी कभी यह सेट या निर्धारित नहीं करता है स्क्रिप्ट को आंतरिक लूप रीडायरेक्ट करने के कारण, चालू, बंद आदि।

यहाँ सबसे विश्वसनीय समाधान के लिए अपने सर्वर का समर्थन करता है, तो है $ _SERVER [SCRIPT_URI]

if (stripos(substr($_SERVER[SCRIPT_URI], 0, 5), "https") === false) { 
    header("location:https://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"); 
    echo "<meta http-equiv='refresh' content='0; url=https://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]'>"; 
    exit; 
} 

कृपया ध्यान दें कि अपने स्थापना के आधार पर, अपने सर्वर $ _SERVER [SCRIPT_URI] का समर्थन नहीं कर सकते हैं, लेकिन अगर यह होता है , यह उपयोग करने के लिए बेहतर स्क्रिप्ट है।

आप यहाँ देख सकते हैं: Why do some PHP installations have $_SERVER['SCRIPT_URI'] and others not

1

आईआईएस का उपयोग करने वालों web.config में इस लाइन को जोड़ने में मदद मिलेगी के लिए:

<httpProtocol> 
    <customHeaders> 
     <add name="Strict-Transport-Security" value="max-age=31536000"/> 
    </customHeaders> 
</httpProtocol> 
<rewrite> 
    <rules> 
     <rule name="HTTP to HTTPS redirect" stopProcessing="true"> 
       <match url="(.*)" /> 
       <conditions> 
       <add input="{HTTPS}" pattern="off" ignoreCase="true" /> 
       </conditions> 
       <action type="Redirect" redirectType="Found" url="https://{HTTP_HOST}/{R:1}" /> 
     </rule> 
    </rules> 
</rewrite> 

एक पूर्ण फ़ाइल उदाहरण

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
    <system.webServer> 
     <httpProtocol> 
      <customHeaders> 
       <add name="Strict-Transport-Security" value="max-age=31536000"/> 
      </customHeaders> 
     </httpProtocol> 
     <rewrite> 
      <rules> 
       <rule name="HTTP to HTTPS redirect" stopProcessing="true"> 
         <match url="(.*)" /> 
         <conditions> 
         <add input="{HTTPS}" pattern="off" ignoreCase="true" /> 
         </conditions> 
         <action type="Redirect" redirectType="Found" url="https://{HTTP_HOST}/{R:1}" /> 
       </rule> 
      </rules> 
     </rewrite> 
    </system.webServer> 
</configuration> 
+0

सवाल विशेष रूप से अपाचे के बारे में पूछता है, आईआईएस नहीं। – Quentin

+0

ए) यह अपाचे टैग नहीं किया गया है। अपाचे उद्धरण के बीच metioned है। बी) यह एक सामान्य सवाल है जिसमें सामान्य रूप से अपाचे से कोई लेना देना नहीं है। यह कई PHP समर्थन वेबसर्वर पर लागू होता है – Tschallacka

2

उपयोग htaccess:

#if domain has www. and not https:// 
    RewriteCond %{HTTPS} =off [NC] 
    RewriteCond %{HTTP_HOST} ^(?i:www+\.+[^.]+\.+[^.]+)$ 
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [QSA,L,R=307] 

#if domain has not www. 
    RewriteCond %{HTTP_HOST} ^([^.]+\.+[^.]+)$ 
    RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [QSA,L,R=307]