Trong bài viết này, chúng ta sẽ cùng khám phá về việc mã hóa và giải mã URL bằng PHP. Thật đơn giản và thú vị đấy!
Nhu cầu mã hóa và giải mã URL
Đôi khi, bạn có thể muốn chuyển đổi một URL thành các tham số truy vấn để gửi tới một dịch vụ hoặc trang web khác. Ví dụ, bạn muốn gửi dữ liệu của mình tới một trang web với địa chỉ như sau:
https://code.tutsplus.com?redirect=httpspercent3Apercent2Fpercent2Fdangvoweb.com&author=gialaipc&page=2
Trong ví dụ trên, các ký tự đặc biệt như “:” và “/” trong URL đã được mã hóa thành “%3A” và “%2F” để tránh làm thay đổi cấu trúc chung của URL. Điều này được gọi là “escaping”, và đó là lúc các hàm mã hóa URL được sử dụng.
Máy chủ tại dangvoweb.com sẽ nhận URL đã được mã hóa trong chuỗi truy vấn và có thể sẽ cần giải mã nó sau này. Đó là lúc giải mã URL trở nên quan trọng.
Mã hóa URL với urlencode() và rawurlencode()
PHP cung cấp hai hàm để mã hóa URL: urlencode() và rawurlencode(). Cả hai hàm này đều có vai trò mã hóa URL, tuy nhiên chúng khác nhau về các ký tự được mã hóa và cách xử lý dấu cách.
Trong trường hợp của urlencode(), hàm này thay thế tất cả các ký tự không phải chữ và số (ngoại trừ “-“, ““, và “.”) bằng một ký tự “%”, sau đó là hai ký tự hex tương ứng. Tất cả các dấu cách cũng được thay thế bằng dấu “+”. Ngược lại, hàm rawurlencode() thay thế tất cả các ký tự không phải chữ và số (ngoại trừ “-“, ““, “.”, và “~”) bằng một ký tự “%”, sau đó là hai ký tự hex tương ứng. Hàm này cũng thay thế dấu cách bằng “%20”.
Ví dụ sau sẽ giúp bạn hiểu rõ hơn:
$url_string = 'https://code.tutsplus.com/tutorials?question=php fundamentals&page=2';
$urlencoded_string = urlencode($url_string);
echo $urlencoded_string;
// Kết quả: httpspercent3Apercent2Fpercent2Fcode.tutsplus.compercent2Ftutorialspercent3Fquestionpercent3Dphp+fundamentalspercent26pagepercent3D2
$rawurlencoded_string = rawurlencode($url_string);
echo $rawurlencoded_string;
// Kết quả: httpspercent3Apercent2Fpercent2Fcode.tutsplus.compercent2Ftutorialspercent3Fquestionpercent3Dphppercent20fundamentalspercent26pagepercent3D2
Nói chung, nên sử dụng rawurlencode() để mã hóa URL của bạn. Có một số lí do cho điều này. Thứ nhất, rawurlencode() mã hóa URL dựa trên lược đồ RFC 3986 hiện đại hơn. Thứ hai, nó mang lại tính nhất quán và khả năng tương thích tốt hơn nếu URL của bạn sau này cần được giải mã bằng JavaScript.
Giải mã URL với urldecode() và rawurldecode()
Hàm urldecode() và rawurldecode() được sử dụng để khôi phục các thay đổi được thực hiện bởi các hàm mã hóa URL urlencoe() và rawurlencode().
Đơn giản, điều này có nghĩa là tất cả các chuỗi chứa các ký tự được thay thế bởi % và hai ký tự hex tương ứng sẽ được đổi lại thành các ký tự gốc của chúng. Hàm urldecode() sẽ thay thế dấu “+” bằng một dấu cách, trong khi hàm rawurldecode() không thay đổi.
Dưới đây là ví dụ minh họa:
$urlencoded_string = 'httpspercent3Apercent2Fpercent2Fcode.tutsplus.compercent2Ftutorialspercent3Fquestionpercent3Dphp+fundamentalspercent26pagepercent3D2';
echo urldecode($urlencoded_string);
// Kết quả: https://code.tutsplus.com/tutorials?question=php fundamentals&page=2
echo rawurldecode($urlencoded_string);
// Kết quả: https://code.tutsplus.com/tutorials?question=php+fundamentals&page=2
$rawurlencoded_string = 'httpspercent3Apercent2Fpercent2Fcode.tutsplus.compercent2Ftutorialspercent3Fquestionpercent3Dphppercent20fundamentalspercent26pagepercent3D2';
echo urldecode($rawurlencoded_string);
// Kết quả: https://code.tutsplus.com/tutorials?question=php fundamentals&page=2
echo rawurldecode($rawurlencoded_string);
// Kết quả: https://code.tutsplus.com/tutorials?question=php fundamentals&page=2
Trong ví dụ trên, chúng ta đã sử dụng các hàm giải mã để giải mã các URL mà chúng ta đã mã hóa trong ví dụ trước đó. Biến $urlencoded_string đã thay đổi ký tự dấu cách thành dấu “+”. Sử dụng hàm urldecode() trên chuỗi này sẽ đổi nó trở lại ký tự dấu cách. Tuy nhiên, hàm rawurldecode() không thay đổi.
Biến $rawurlencoded_string có dấu cách được thay thế bằng “%20”, và cả hai hàm urldecode() và rawurldecode() đều xử lý nó theo cùng một cách.
Quan trọng nhất là hãy chú ý đến loại hàm bạn sử dụng để giải mã một URL đã được mã hóa, vì kết quả cuối cùng có thể khác nhau tùy thuộc vào loại mã hóa ban đầu.
Lời kết
Trong bài viết này, chúng ta đã tìm hiểu cách mã hóa và giải mã URL bằng PHP. Chúng ta đã bắt đầu với nhu cầu mã hóa và giải mã URL và sau đó xem xét tổng quan về bốn hàm khác nhau để thực hiện điều đó.
Như tôi đã đề cập trước đó, an toàn nhất là sử dụng rawurlencode() và rawurldecode() trong tất cả các trường hợp. Điều này đảm bảo tính nhất quán trong mã của bạn cũng như khả năng tương thích với các ngôn ngữ khác sử dụng lược đồ mã hóa và giải mã URL hiện đại.
Nếu bạn muốn tìm hiểu thêm về lập trình web và PHP, hãy ghé thăm Dangvoweb.com! Chúng tôi luôn sẵn sàng giúp bạn.