Chuyển hướng từ HTTP sang HTTPS bằng PHP


107

Tôi đang làm việc trên trang web giỏ hàng và tôi muốn chuyển hướng người dùng đến trang HTTPS khi anh ấy nhập chi tiết thanh toán và duy trì kết nối HTTPS cho các trang tiếp theo cho đến khi anh ấy đăng xuất.

Tôi cần cài đặt gì trên máy chủ (tôi đang sử dụng Apache) để thực hiện việc này và làm cách nào để chuyển hướng này được thực hiện từ PHP?

Câu trả lời:


247

Hãy thử một cái gì đó như thế này (sẽ hoạt động cho Apache và 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
Nó không hoạt động luôn luôn. Tôi đã thử sử dụng nó và không có phần tử 'https' nào trong mảng $ _SERVER do nó gây ra lỗi 'quá nhiều chuyển hướng'. Sẽ cần phải sử dụng phương pháp khác.
Usman Zaheer

5
Tôi đã phải kiểm tra if( $_SERVER['HTTPS'] == "off")để mã này hoạt động. Tôi nghĩ đó là vì tôi đang sử dụng IIS, không phải Apache như OP.
Nick Pickering

1
@NicholasPickering Jepp, các biến $ _SERVER có thể thay đổi theo máy chủ web.
Raphael Michel

6
Lưu ý: die () hoặc exit () có thể quan trọng khi đặt sau chuyển hướng tiêu đề để ngăn phần còn lại của trang thực thi (và có thể gửi thêm thông tin cho máy khách) (tức là cho tin tặc hoặc trình duyệt có thể không tôn trọng tiêu đề).
dajon

3
Tùy thuộc vào môi trường máy chủ / thiết lập của bạn, bạn có thể cần sử dụng $ _SERVER ['HTTP_X_FORWARDED_PROTO'] để kiểm tra http / https
David Meister,

19

Đây là một cách tốt để làm điều đó:

<?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
hoạt động tốt một đánh dấu là tốt sẽ trở lại một chuyển hướng quá nhiều lần ít nhất trong Chrome
Thomas J Younsi

Điều kiện !(isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on'sẽ luôn là false, vì nếu phần cuối cùng là đúng thì phần đầu tiên sẽ là sai.
Tối đa

@Max: Tôi không hiểu những gì bạn nói. Nếu điều kiện thứ hai là true ($ _SERVER ['HTTPS'] == 'on') thì điều kiện đầu tiên cũng phải là TRUE (tất nhiên biến máy chủ đó được đặt, vì nó chứa một giá trị!)
OMA

7

Chuyển hướng từ HTTP sang HTTPS với PHP trên IIS

Tôi đã gặp sự cố khi chuyển hướng sang HTTPS để hoạt động trên máy chủ Windows chạy phiên bản 6 của MS Internet Information Services (IIS) . Tôi quen làm việc với Apache trên máy chủ Linux hơn nên tôi đã tìm đến Internet để được trợ giúp và đây là câu hỏi Stack Overflow có xếp hạng cao nhất khi tôi tìm kiếm “php redirect http to https” . Tuy nhiên, câu trả lời đã chọn không phù hợp với tôi.

Sau một số thử nghiệm và sai sót, tôi phát hiện ra rằng với IIS, $_SERVER['HTTPS']được đặt thành offcác kết nối không phải TLS. Tôi nghĩ đoạn mã sau sẽ giúp ích cho bất kỳ người dùng IIS nào khác đến câu hỏi này thông qua công cụ tìm kiếm.

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

Chỉnh sửa : Từ một câu trả lời Stack Overflow khác , một giải pháp đơn giản hơn là kiểm tra if($_SERVER["HTTPS"] != "on").


13
@JakeSylvestre Đủ công bằng. Cho rằng câu hỏi này không được gắn thẻ là apache, tôi đã đăng câu trả lời này vì lợi ích của những người dùng IIS khác (tương tự như trường hợp của tôi), những người có thể xem trang này qua công cụ tìm kiếm. Tôi đăng ký với quan điểm rằng câu trả lời là vì lợi ích của cả cộng đồng chứ không chỉ OP.
Anthony Geoghegan

6

Bạn luôn có thể sử dụng

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

để chuyển hướng đến URL lưu.

Nhưng tôi khuyên bạn nên làm điều đó bằng .htaccess và các quy tắc viết lại Apache.


13
Tôi luôn khuyên bạn nên kiểm tra $ _SERVER ['HTTPS'] trước khi chuyển hướng.
Raphael Michel

$ _SERVER ['HTTPS'] không phải lúc nào cũng được đặt, nhưng bạn nên kiểm tra trước. Đó là lý do tại sao tôi khuyên bạn nên làm điều đó với một quy tắc viết lại hữu ích trong Apache, quy tắc này chỉ chuyển hướng khi không có trên HTTPS.
powtac

Mặc dù Apache khuyến cáo không nên sử dụng thêm tệp .htaccess (vì nó làm chậm) mà nên sử dụng các quy tắc viết lại bên trong * .conf của Apache.
powtac

1

Trên máy chủ cây đậu AWS của mình, tôi không thấy biến $ _SERVER ['HTTPS']. Tôi thấy $ _SERVER ['HTTP_X_FORWARDED_PROTO'] có thể là 'http' hoặc 'https', vì vậy nếu bạn đang lưu trữ trên AWS, hãy sử dụng cái này:

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;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.