เปลี่ยนเส้นทางจาก HTTP ไปยัง HTTPS ด้วย PHP


108

ฉันทำงานในเว็บไซต์รถเข็นช็อปปิ้งและต้องการเปลี่ยนเส้นทางผู้ใช้ไปยังหน้า HTTPS เมื่อเขาป้อนรายละเอียดการเรียกเก็บเงินและรักษาการเชื่อมต่อ HTTPS สำหรับหน้าถัดไปจนกว่าเขาจะออกจากระบบ

ฉันต้องติดตั้งอะไรบนเซิร์ฟเวอร์ (ฉันใช้ Apache) เพื่อที่จะทำสิ่งนี้และจะเปลี่ยนเส้นทางจาก PHP ได้อย่างไร

คำตอบ:


248

ลองทำสิ่งนี้ (ควรใช้ได้กับ Apache และ IIS):

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

5
มันไม่ได้ผลเสมอไป ฉันลองใช้มันและไม่มีองค์ประกอบ 'https' ในอาร์เรย์ $ _SERVER เนื่องจากมันให้ข้อผิดพลาดของ 'การเปลี่ยนเส้นทางมากเกินไป' คงต้องใช้วิธีอื่น
Usman Zaheer

5
ฉันต้องทดสอบif( $_SERVER['HTTPS'] == "off")เพื่อให้รหัสนี้ใช้งานได้ ฉันคิดว่าเป็นเพราะฉันใช้ IIS ไม่ใช่ Apache เหมือน OP
Nick Pickering

1
@NicholasPickering Jepp ตัวแปร $ _SERVER อาจแตกต่างกันไปตามเว็บเซิร์ฟเวอร์
Raphael Michel

6
หมายเหตุ: die () หรือ exit () เป็นสิ่งสำคัญที่จะต้องใส่ไว้หลังการเปลี่ยนเส้นทางส่วนหัวเพื่อป้องกันไม่ให้ส่วนที่เหลือของเพจดำเนินการ (และอาจส่งข้อมูลเพิ่มเติมไปยังไคลเอนต์) (เช่นแฮกเกอร์หรือเบราว์เซอร์ที่อาจไม่เคารพส่วนหัว)
dajon

3
ขึ้นอยู่กับสภาพแวดล้อม / การตั้งค่าเซิร์ฟเวอร์ของคุณคุณอาจต้องใช้ $ _SERVER ['HTTP_X_FORWARDED_PROTO'] เพื่อตรวจสอบ http / https
David Meister

20

นี่เป็นวิธีที่ดีที่จะทำ:

<?php
if (!(isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on' || 
   $_SERVER['HTTPS'] == 1) ||  
   isset($_SERVER['HTTP_X_FORWARDED_PROTO']) &&   
   $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https'))
{
   $redirect = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
   header('HTTP/1.1 301 Moved Permanently');
   header('Location: ' . $redirect);
   exit();
}
?>

1
ทำงานได้ดีคนที่ทำเครื่องหมายว่าดีจะส่งกลับการเปลี่ยนเส้นทางหลายครั้งเกินไปอย่างน้อยใน Chrome
Thomas J Younsi

เงื่อนไข!(isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on'จะเป็นเท็จเสมอเนื่องจากถ้าส่วนสุดท้ายเป็นจริงส่วนแรกจะเป็นเท็จ
สูงสุด

@ แม็กซ์: ฉันไม่เข้าใจในสิ่งที่คุณพูด หากเงื่อนไขที่สองเป็นจริง ($ _SERVER ['HTTPS'] == 'on') เงื่อนไขแรกจะต้องเป็น TRUE เช่นกัน (แน่นอนว่าตัวแปรเซิร์ฟเวอร์ถูกตั้งค่าเนื่องจากมีค่า!)
OMA

7

เปลี่ยนเส้นทางจาก HTTP เป็น HTTPS ด้วย PHP บน IIS

ผมมีปัญหาในการเปลี่ยนเส้นทางไปยัง HTTPS ในการทำงานบนเซิร์ฟเวอร์ Windows ซึ่งทำงานรุ่น 6 ของMS Internet Information Services (IIS) ฉันมากขึ้นใช้ในการทำงานกับ Apache บนโฮสต์ Linux ดังนั้นผมจึงหันไปทางอินเทอร์เน็ตเพื่อขอความช่วยเหลือและนี่คือการจัดอันดับสูงสุดคำถามกองมากเกินเมื่อฉันค้นหา“PHP เปลี่ยนเส้นทาง http เพื่อ https” อย่างไรก็ตามคำตอบที่เลือกไม่ได้ผลสำหรับฉัน

หลังจากลองผิดลองถูกฉันพบว่า IIS $_SERVER['HTTPS']ถูกตั้งค่าเป็นoffสำหรับการเชื่อมต่อที่ไม่ใช่ TLS ฉันคิดว่ารหัสต่อไปนี้น่าจะช่วยผู้ใช้ IIS คนอื่น ๆ ที่เจอคำถามนี้ผ่านทางเครื่องมือค้นหา

<?php
if (! isset($_SERVER['HTTPS']) or $_SERVER['HTTPS'] == 'off' ) {
    $redirect_url = "https://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
    header("Location: $redirect_url");
    exit();
}
?>

แก้ไข : จากอีกคำตอบที่กองมากเกินif($_SERVER["HTTPS"] != "on")เป็นทางออกที่ง่ายคือการตรวจสอบ


13
@JakeSylvestre พอใช้. เนื่องจากคำถามนี้ไม่ได้ติดแท็กapacheฉันจึงโพสต์คำตอบนี้เพื่อประโยชน์ของผู้ใช้ IIS คนอื่น ๆ (คล้ายกับสถานการณ์ที่ฉันอยู่) ซึ่งอาจเจอหน้านี้ผ่านเครื่องมือค้นหา ฉันสมัครรับข้อมูลมุมมองที่ว่าคำตอบมีไว้เพื่อประโยชน์ของชุมชนโดยรวมไม่ใช่แค่ OP
Anthony Geoghegan

6

คุณสามารถใช้

header('Location: https://www.domain.com/cart_save/');

เพื่อเปลี่ยนเส้นทางไปยัง URL บันทึก

แต่ฉันอยากจะแนะนำให้ทำโดย. htaccess และ Apache เขียนกฎใหม่


13
ฉันอยากจะแนะนำให้ตรวจสอบ $ _SERVER ['HTTPS'] ก่อนเปลี่ยนเส้นทางเสมอ
Raphael Michel

ไม่ได้ตั้งค่า $ _SERVER ['HTTPS'] เสมอไป แต่ควรตรวจสอบก่อน นั่นเป็นเหตุผลที่ฉันแนะนำให้ใช้กฎการเขียนซ้ำที่มีประโยชน์ใน Apache ซึ่งจะเปลี่ยนเส้นทางเฉพาะเมื่อไม่ได้อยู่บน HTTPS
powtac

แม้ว่า Apache จะไม่แนะนำให้ใช้ไฟล์. htaccess พิเศษ (เนื่องจากทำงานช้าลง) แต่ให้ใช้กฎการเขียนซ้ำภายใน * .conf ของ Apache
powtac

1

บนเซิร์ฟเวอร์ AWS beanstalk ของฉันฉันไม่เห็นตัวแปร $ _SERVER ['HTTPS'] ฉันเห็น $ _SERVER ['HTTP_X_FORWARDED_PROTO'] ซึ่งอาจเป็น 'http' หรือ 'https' ดังนั้นหากคุณโฮสต์บน AWS ให้ใช้สิ่งนี้:

if ($_SERVER['HTTP_HOST'] != 'localhost' and $_SERVER['HTTP_X_FORWARDED_PROTO'] != "https") {
    $location = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
    header('HTTP/1.1 301 Moved Permanently');
    header('Location: ' . $location);
    exit;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.