Câu hỏi Chuyển hướng từ HTTP sang HTTPS bằng PHP


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 của mình 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à cách chuyển hướng này có thể được thực hiện từ PHP?


76
2018-02-24 14:57


gốc




Các câu trả lời:


Hãy thử một cái gì đó như thế này (nên làm việc cho Apache và IIS):

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

181
2018-02-09 16:22



Nó không hoạt động luôn. Tôi đã thử sử dụng nó và không có phần tử 'https' trong mảng $ _SERVER do nó đã đưa ra lỗi của 'quá nhiều chuyển hướng'. Sẽ cần phải sử dụng phương pháp khác. - Usman Zaheer
Tôi phải kiểm tra if( $_SERVER['HTTPS'] == "off") để mã này hoạt động. Tôi nghĩ rằng đó là bởi vì tôi đang trên IIS, không phải Apache như OP. - Nicholas Pickering
@NicholasPickering Jepp, biến $ _SERVER có thể thay đổi với máy chủ web. - Raphael Michel
Lưu ý: die () hoặc exit () có thể rất quan trọng để đặt sau khi 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 khách hàng) (tức là tin tặc hoặc trình duyệt có thể không tôn trọng tiêu đề). - user2533809
Tùy thuộc vào môi trường / thiết lập máy chủ của bạn, bạn có thể cần phải sử dụng $ _SERVER ['HTTP_X_FORWARDED_PROTO'] để kiểm tra http / https - David Meister


Đây là một cách hay để thực hiện:

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

9
2018-02-24 14:59



hoạt động tốt được đánh dấu là tốt sẽ trả lại chuyển hướng quá nhiều lần ít nhất trong Chrome - Thomas J Younsi


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.


5
2017-11-27 18:04



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, mà chỉ chuyển hướng khi nó không phải trên HTTPS. - powtac
Mặc dù Apache khuyên bạn không nên sử dụng tệp .htaccess thừa (vì nó làm chậm) nhưng để sử dụng các quy tắc viết lại bên trong * .conf của Apache. - powtac


Chuyển hướng từ HTTP sang HTTPS bằng 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 Dịch vụ thông tin Internet MS (IIS). Tôi còn hơn thế nữa đã từng làm việc với Apache trên máy chủ Linux nên tôi đã chuyển sang Internet để trợ giúp và đây là câu hỏi Stack Overflow xếp hạng cao nhất khi tôi tìm kiếm cho “Chuyển hướng php http thành https”. Tuy nhiên, câu trả lời đã chọn không hoạt động cho tôi.

Sau một số thử nghiệm và lỗi, tôi phát hiện ra rằng với IIS, $_SERVER['HTTPS'] Là đặt thành off cho các kết nối không phải TLS. Tôi nghĩ đoạn mã sau nên giúp bất kỳ người dùng IIS nào khác đến với 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: Đến từ một nơi khác Câu trả lời tràn ngăn xếp, một giải pháp đơn giản hơn là kiểm tra if($_SERVER["HTTPS"] != "on").


3



okay ... nhưng op cho biết anh ta đang sử dụng apache - Jake Sylvestre
@JakeSylvestre Fair đủ. Do câu hỏi này không được gắn thẻ 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ư tình huống tôi đang ở), những người có thể gặp phải trang này thông qua công cụ tìm kiếm. Tôi đăng ký để xem rằng câu trả lời là vì lợi ích của cộng đồng nói chung và không chỉ là OP. - Anthony Geoghegan