ฉันจะบังคับให้ผู้ใช้เข้าถึงหน้าของฉันผ่าน HTTPS แทน HTTP ได้อย่างไร


137

ฉันมีหน้าเดียวที่ฉันต้องการบังคับให้เข้าถึงได้เป็นหน้า HTTPS (PHP บน Apache) ฉันจะทำสิ่งนี้โดยไม่ทำให้ทั้งไดเร็กทอรีต้องการ HTTPS ได้อย่างไร หรือถ้าคุณส่งแบบฟอร์มไปยังหน้า HTTPS จากหน้า HTTP มันจะส่งโดย HTTPS แทน HTTP หรือไม่?

นี่คือตัวอย่างของฉัน:

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

ฉันต้องการให้เข้าถึงได้ผ่าน:

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

แน่นอนว่าฉันสามารถใส่ลิงก์ทั้งหมดไปยังหน้านี้ซึ่งชี้ไปที่รุ่น HTTPS แต่นั่นก็ไม่ได้ทำให้คนโง่บางคนเข้าถึงมันผ่านทาง HTTP โดยมีวัตถุประสงค์ ...

สิ่งหนึ่งที่ฉันคิดคือการเปลี่ยนเส้นทางในส่วนหัวของไฟล์ PHP เพื่อตรวจสอบให้แน่ใจว่าพวกเขากำลังเข้าถึงรุ่น HTTPS:

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

แต่นั่นไม่ใช่วิธีที่ถูกต้องใช่ไหม



3
มีเหตุผลใดที่คุณไม่เพียงต้องการ SSL สำหรับทุกหน้า?
Tahaan

คำตอบ:


177

วิธีที่ฉันเคยทำมาก่อนนั้นเป็นเหมือนสิ่งที่คุณเขียน แต่ไม่มีค่าฮาร์ดโค้ด:

if ($ _ SERVER ["HTTPS"]! = "เปิด")
{
    ส่วนหัว ("สถานที่ตั้ง: https: //". $ _SERVER ["HTTP_HOST"]. $ _SERVER ["REQUEST_URI"]);
    ออกจาก ();
}

15
คุณลืมโทรออก () เพื่อให้แน่ใจว่าสคริปต์จบการทำงานหลังจากเปลี่ยนเส้นทาง ฉันมักจะห่อในฟังก์ชันที่เรียกว่า requireSSL () ฉันสามารถเรียกสิ่งนี้ได้ที่ด้านบนของหน้าใดก็ได้ที่ฉันต้องการเข้ารหัส
Jesse Weigert

31
เปลี่ยน if เป็น(empty($_SERVER["HTTPS"]) || $_SERVER["HTTPS"] !== "on")เพื่อแก้ไขประกาศ PHP
dave1010

$_SERVER[]ตัวแปรไม่สามารถเปลี่ยนแปลง / เสี่ยงต่อการแทรกแซงของผู้ใช้ได้หรือไม่
Arian Faurtosh

@ArianFaurtosh แหล่งที่มา?
John

3
@ArianFaurtosh บางอย่างถูกดึงออกมาจากส่วนหัวของลูกค้าเช่นHTTP_X_FORWARDEDและสามารถจัดการได้ แต่คนอื่น ๆ เช่นHTTPSหรือSERVER_PORTถูกตั้งค่าโดยตรงจากเว็บเซิร์ฟเวอร์และควรจะปลอดภัย
Mahn

46

คุณสามารถทำได้ด้วยคำสั่งและ mod_rewrite บน Apache:

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

คุณสามารถทำให้ตำแหน่งฉลาดขึ้นเมื่อเวลาผ่านไปโดยใช้นิพจน์ปกติหากคุณต้องการ


6
คุณจะใส่สิ่งนี้ที่ไหน . htaccess หรือไม่

1
REQUEST_URI ไม่รวม "ข้อความค้นหา" (เช่น? page = 1 & id = 41 เป็นต้น) หรือไม่ นั่นคือสิ่งที่เอกสาร Apache บอกว่า ... ดังนั้นหากฉันพยายามเข้าถึงsite.com/index.php?page=1&id=12ฉันจะถูกเปลี่ยนเส้นทางsite.com/index.php
Rolf

2
จาก apache Documentation: REQUEST_URI คอมโพเนนต์พา ธ ของ URI ที่ร้องขอเช่น "/index.html" สิ่งนี้จะแยกสตริงการสืบค้นที่มีอยู่เป็นตัวแปรของตัวเองชื่อ QUERY_STRING ดังนั้นคุณต้องเพิ่ม QUERY_STRING หลังจาก REQUEST_URI
Rolf

2
คุณต้องเพิ่ม [R] flage หลังจากนั้นเพื่อเปลี่ยนเส้นทาง
Rolf

40

คุณควรบังคับให้ไคลเอนต์ร้องขอ 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 ได้รับการสนับสนุนในเบราว์เซอร์ที่ทันสมัยที่สุด แต่ไม่ใช่สากล ดังนั้นตรรกะดังกล่าวข้างต้นเปลี่ยนเส้นทางผู้ใช้ด้วยตนเองโดยไม่คำนึงถึงการสนับสนุนหากพวกเขาท้ายบน HTTP และจากนั้นตั้งค่าส่วนหัว HSTS เพื่อให้การร้องขอของลูกค้าต่อไปควรจะเปลี่ยนเส้นทางโดยเบราว์เซอร์ถ้าเป็นไปได้


ฉันประหลาดใจที่ไม่ใช่คำตอบอื่น ๆ รวมหัวข้อนี้มันสำคัญมาก ... ข้อผิดพลาดใด ๆ ในการรวมสองคำนี้เข้าด้วยกัน?
keisar

ไม่ ... คุณสามารถตั้งค่าส่วนหัวนั้นได้แน่นอนหากคุณต้องการ HTTPS เสมอ เป็นเพียงการจัดเรียงซ้ำซ้อนเพื่อตั้งค่าก่อนและหลังจากที่คุณทำการเปลี่ยนเส้นทาง ฉันได้แก้ไขคำตอบของฉันด้านบนเพื่ออธิบายความเข้ากันได้ที่แม่นยำยิ่งขึ้น
Jacob Swartwood

1
(การทำซ้ำความคิดเห็นดั้งเดิม) ฉันไม่ได้สังเกตเห็นข้อกำหนดเฉพาะของ "หน้าเดียว" HSTS จะใช้กับทุกหน้า คำตอบของฉันไม่ถูกต้องทางเทคนิค
Jacob Swartwood

4
FYI, ส่วน RFC 6797 มาตรฐาน 7.2 กล่าวว่า "โฮสต์ HSTS ต้องไม่รวมฟิลด์ส่วนหัวของ STS ในการตอบกลับ HTTP ที่ถ่ายทอดผ่านการขนส่งที่ไม่ปลอดภัย" ดังนั้นไม่จำเป็นต้องส่งเมื่อการร้องขอเป็น http ปกติมันควรจะถูกละเว้นหากเบราว์เซอร์เป็นไปตามมาตรฐาน
Frank Forte

1
@mark หากมี MITM และเว็บไซต์ของคุณไม่มีส่วนหัวนี้คุณสามารถอนุญาตให้เซสชันประกอบด้วยไปที่ http และผู้ใช้ป้อนรายละเอียดของพวกเขาและพวกเขาอาจจะไม่สังเกตเห็นและการเปลี่ยนเส้นทางจะไม่ช่วย (คนใน ตรงกลางจะเชื่อมต่อกับเว็บไซต์ผ่าน https และแสดงเป็น http) การใช้ส่วนหัวนี้จะบังคับ HTTPS ทางฝั่งไคลเอ็นต์ สิ่งนี้มีความสำคัญอย่างยิ่งเนื่องจากช่องโหว่ความปลอดภัย WPA2 WiFi ที่ผ่านมา
Rudiger

19

ฉันเพิ่งสร้างไฟล์. htaccess แล้วเพิ่ม:

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

ง่าย!


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

8

ต้องทำอะไรแบบนี้เมื่อทำงานอยู่เบื้องหลังโหลดบาลานเซอร์ 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;
    }
}

6

วิธี PHP:

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

วิธี Apache mod_rewrite:

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

ฉันชอบวิธี PHP เพราะมีอินสแตนซ์ที่ฉันต้องการแทนที่ข้อกำหนดสำหรับ SSL ตัวอย่างเช่นการเข้าถึง API และสิ่งต่างๆในท้องถิ่นเช่น Autoconfigure ของ Mozilla Thunderbird และอื่น ๆ อีกมากมาย
Jay

วิธี PHP ใช้งานได้ดีสำหรับฉันขอแนะนำอย่างยิ่ง
Moxet

5

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

บางครั้งคุณอาจต้องตรวจสอบให้แน่ใจว่าผู้ใช้เรียกดูเว็บไซต์ของคุณผ่านการเชื่อมต่อที่ปลอดภัย วิธีง่าย ๆ ในการเปลี่ยนเส้นทางผู้ใช้ไปยังการเชื่อมต่อที่ปลอดภัย (https: //) สามารถทำได้ด้วยไฟล์. htaccess ที่มีบรรทัดต่อไปนี้:

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

โปรดทราบว่า. htaccess ควรอยู่ในโฟลเดอร์หลักของเว็บไซต์

ในกรณีที่คุณต้องการบังคับให้ HTTPS สำหรับโฟลเดอร์ใดโฟลเดอร์หนึ่งคุณสามารถใช้:

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

ไฟล์. htaccess ควรอยู่ในโฟลเดอร์ที่คุณต้องการบังคับใช้ HTTPS


5

ตกลง .. ตอนนี้มีสิ่งต่างๆมากมายในตอนนี้ แต่ไม่มีใครตอบคำถาม "ปลอดภัย" ได้อย่างสมบูรณ์ สำหรับฉันมันเป็นเรื่องไร้สาระที่จะใช้สิ่งที่ไม่ปลอดภัย

ถ้าคุณใช้มันเป็นเหยื่อ

$ _SERVER การเผยแพร่สามารถเปลี่ยนแปลงได้ตามความต้องการของคนที่รู้วิธี

เช่นเดียวกับ Sazzad Tushar Khan และ thebigjc กล่าวว่าคุณยังสามารถใช้ httaccess เพื่อทำสิ่งนี้และมีคำตอบมากมายที่บรรจุไว้

เพียงเพิ่ม:

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

ไปยังจุดสิ้นสุดของสิ่งที่คุณมีใน. httaccess ของคุณและนั่นคือสิ่งนั้น

ถึงกระนั้นเราก็ยังไม่ปลอดภัยเท่าที่ควรเนื่องจากเครื่องมือ 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 ส

แต็คบางส่วนที่นี่ -> บังคับใช้ SSL / https โดยใช้. htaccess และ mod_rewrite
และ
รับ URL เต็มของ หน้าปัจจุบัน (PHP)
เพื่อบอกชื่อคู่รัก


2
ERR_TOO_MANY_REDIRECTSแต่ตอนนี้ผมได้รับข้อผิดพลาดต่อไปนี้: ฉันจะแก้ไขได้อย่างไร
Pathros

3

ใช้$_SERVER['HTTPS']เพื่อบอกว่าเป็นSSLหรือไม่และเปลี่ยนเส้นทางไปยังตำแหน่งที่ถูกต้องหากไม่ใช่

และโปรดจำไว้ว่าหน้าเว็บที่แสดงฟอร์มไม่จำเป็นต้องป้อนผ่าน HTTPS เป็น URL โพสต์กลับที่ต้องการมากที่สุด

แก้ไข : ใช่ดังที่อธิบายไว้ด้านล่างเป็นการดีที่สุดที่จะมีกระบวนการทั้งหมดใน HTTPS มันให้ความมั่นใจมากขึ้น - ฉันชี้ให้เห็นว่าโพสต์เป็นส่วนที่สำคัญที่สุด นอกจากนี้คุณต้องระวังว่าคุกกี้ใดถูกตั้งค่าให้ปลอดภัยดังนั้นคุกกี้จะถูกส่งผ่าน SSL เท่านั้น โซลูชัน mod_rewrite นั้นดีมากฉันใช้มันเพื่อรักษาความปลอดภัยของแอปพลิเคชันจำนวนมากในเว็บไซต์ของฉันเอง


จริงอยู่ที่ฟอร์มนั้นไม่จำเป็นต้องเป็น https แต่เป็นความคิดที่ดีสำหรับคนส่วนใหญ่ที่ไม่ทราบเรื่องนี้ หากพวกเขากำลังจะส่งแบบฟอร์มและสังเกตเห็นว่าไอคอนล็อคไม่ได้อยู่ที่นั่นพวกเขาอาจสันนิษฐานว่ารูปแบบที่ไม่ปลอดภัย
แกรมเพอร์โรว์

1
@Graeme: นอกจากนี้ไม่มีใครสามารถมั่นใจได้ว่าแบบฟอร์มจะถูกส่งผ่าน https แบบฟอร์มทั้งหมด (แสดงผ่าน http) อาจเป็นของปลอมส่งไปยังไซต์ cleartext ที่ไม่รู้จักหรือ http Https ไม่ได้เกี่ยวกับการเข้ารหัสเท่านั้น แต่ยังตรวจสอบสิทธิ์เซิร์ฟเวอร์ด้วย
Olaf Kock

3

ใช้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]

1

อย่าผสม HTTP และ HTTPS ในหน้าเดียวกัน หากคุณมีหน้าแบบฟอร์มที่ให้บริการผ่าน HTTP ฉันจะกังวลเกี่ยวกับการส่งข้อมูล - ฉันไม่สามารถดูว่าการส่งผ่าน HTTPS หรือ HTTP โดยไม่ต้องดูแหล่งที่มาและมองหามัน

การให้บริการแบบฟอร์มผ่าน HTTPS พร้อมกับลิงก์ส่งไม่ได้เป็นการเปลี่ยนแปลงอย่างหนักสำหรับข้อได้เปรียบ


1

หากคุณใช้ Apache หรืออะไรที่เหมือน LiteSpeed ​​ซึ่งรองรับไฟล์. htaccess คุณสามารถทำสิ่งต่อไปนี้ หากคุณยังไม่มีไฟล์. htaccess คุณควรสร้างไฟล์. htaccess ใหม่ในไดเรกทอรีรากของคุณ (โดยปกติจะเป็นที่ตั้งของ index.php) ตอนนี้เพิ่มบรรทัดเหล่านี้เป็นกฎการเขียนครั้งแรกใน. htaccess ของคุณ:

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

คุณต้องการคำแนะนำ "RewriteEngine On" เพียงครั้งเดียวใน. htaccess ของคุณสำหรับกฎการเขียนซ้ำทั้งหมดดังนั้นหากคุณมีอยู่แล้วให้คัดลอกบรรทัดที่สองและบรรทัดที่สาม

ฉันหวังว่านี่จะช่วยได้.


นี่คือสิ่งที่ใช้ได้ผลสำหรับฉันและสิ่งที่ฉันใช้ในสคริปต์ของฉันเองในกรอบการทำงานคล้าย Zend 2 - ฉันไม่เข้าใจ downvote
อันโตนิโอ

บางทีคุณอาจจะได้ downvoted เพราะคำตอบที่เป็นจริงเช่นเดียวกับคนนี้จาก @MatHatrik ที่ถูกโพสต์ขึ้นกว่าปีก่อนหน้านี้?
เหี่ยวแห้ง

1

ใช้สิ่งนี้ไม่เพียงพอ:

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

หากคุณมีเนื้อหา http ใด ๆ (เช่นแหล่งภาพ HTTP ภายนอก) เบราว์เซอร์จะตรวจจับภัยคุกคามที่เป็นไปได้ ดังนั้นโปรดตรวจสอบให้แน่ใจว่าการอ้างอิงและ src ทั้งหมดของคุณภายในโค้ดของคุณคือ https


1

ฉันได้แก้ปัญหาด้วยการตรวจสอบสถานะของ$ _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] ทั้งนี้ขึ้นอยู่กับการติดตั้งของคุณ แต่ถ้าเป็นเช่นนั้นนี่เป็นสคริปต์ที่ดีกว่าในการใช้งาน

คุณสามารถตรวจสอบได้ที่นี่: ทำไมการติดตั้ง PHP บางรายการจึงมี $ _SERVER ['SCRIPT_URI'] และอื่น ๆ ไม่


1

สำหรับผู้ที่ใช้ IIS เพิ่มบรรทัดนี้ใน 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>

คำถามนี้ถามเกี่ยวกับ Apache โดยเฉพาะไม่ใช่ IIS
เควนติน

1
A) apache ที่ไม่ได้ติดแท็ก Apache แบ่งระหว่างคำพูด B) เป็นคำถามทั่วไปที่ไม่มีส่วนเกี่ยวข้องกับ Apache โดยทั่วไป มันใช้ได้กับเว็บเซิร์ฟเวอร์ที่รองรับ php หลายตัว
Tschallacka

0

คุณไม่ควรใช้เหตุผลด้านความปลอดภัย โดยเฉพาะอย่างยิ่งถ้าคุกกี้กำลังเล่นอยู่ที่นี่ มันทำให้คุณเปิดกว้างสำหรับการโจมตีรีเพลย์ที่อิงกับคุกกี้

คุณควรใช้กฎควบคุม Apache เพื่อปรับแต่ง

จากนั้นคุณสามารถทดสอบว่ามีการเปิดใช้งาน HTTPS และเปลี่ยนเส้นทางได้ตามที่ต้องการหรือไม่

คุณควรเปลี่ยนเส้นทางไปยังหน้าชำระเงินโดยใช้ FORM POST (ไม่รับ) และการเข้าถึงหน้าโดยไม่มี POST ควรถูกนำกลับไปยังหน้าอื่น ๆ (สิ่งนี้จะดึงดูดผู้คนเพียงแค่กระโดดร้อนๆ)

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

เป็นจุดเริ่มต้นที่ดีขอโทษที่ไม่ได้ให้บริการเพิ่มเติม แต่คุณควรผลักทุกอย่างผ่าน SSL

มันป้องกันมากเกินไป แต่อย่างน้อยคุณก็มีความกังวลน้อยลง


0

บางทีนี่อาจช่วยคุณได้นั่นคือวิธีที่ฉันทำกับเว็บไซต์ของฉันมันใช้งานได้อย่างมีเสน่ห์:

$protocol = $_SERVER["HTTP_CF_VISITOR"];

if (!strstr($protocol, 'https')){
    header("Location: https://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]);
    exit();
}

0

หากคุณต้องการใช้ PHP ในการทำเช่นนี้วิธีนี้ใช้ได้ดีสำหรับฉัน:


<?php

if(!isset($_SERVER["HTTPS"]) || $_SERVER["HTTPS"] != "on") {
    header("Location: https://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"], true, 301);
    //Prevent the rest of the script from executing.
    exit;
}
?>

มันตรวจสอบตัวแปร HTTPS ในอาร์เรย์ $ _SERVER superglobal เพื่อดูว่ามันเท่ากับ“ เปิด” หากตัวแปรไม่เท่ากับ on


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

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

ง่ายมาก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.