Redirect – Chuyển hướng trang bằng PHP

This entry is part 1 of 1 in the series Học PHP qua ví dụ
  • Redirect – Chuyển hướng trang bằng PHP

Trong việc lập trình web bạn không thể thiếu việc chuyển người dùng từ trang này qua trang kia. Ví dụ như sau khi login thì chuyển người dùng về trang chủ. Hoặc vào các nội dung cần xác thực thì phải chuyển người dùng về trang login.

1. Chuyển trang bằng HTTP header

PHP hỗ trợ chuyển trang bằng cách trả về HTTP header Location theo đặc tả của giao thức HTTP. Khi trình duyệt nhận được response từ server có HTTP header “Location” thì trình duyệt sẽ tự động chuyển hướng đến url được chỉ định.

HTTP header:

Location: <new_URL>

Cách thực hiện đơn giản như sau.

<?php 
// các xử lí
// Tiến hành chuyển hướng
header("Location: /index.php");
exit;

// có thể các còn các xử lí khác không được thực hiện.
?>

Trường hợp bạn muốn chuyển hướng ra trang ngoài không phải trang hiện tại của bạn. Thì bạn hãy để đầy đủ đường dẫn URL.

<?php 
header("Location: https://google.com");
exit;

Các lỗi thường gặp khi sử dụng chuyển hướng bằng header

Lỗi 1: Warning: Cannot modify header information

Khi thực hiện chuyển trang bằng cách này. Tức là bạn đang thay đổi các giá trị HTTP header mặc định. Rất có thể bạn sẽ bị thông báo lỗi khi sau: Warning: Cannot modify header information. Để khác phục được lỗi này. Bạn cần hiểu bản chất vấn được được giải thích như sau. Nếu bạn đang gấp Bỏ qua cách chuyển hướng này và sử dụng các cách chuyển hướng ở bên dưới.

Giải thích:

Theo đặc tả một gói tin HTTP có cấu trúc như sau:

HEADER
<cách 2 dòng>
BODY

Mỗi dấu xuống dòng ở trên là cặp kí tự \r\n;

Ví dụ khi bạn xuất dòng chữ “Hello world”. File hello.php

<?php
echo "Hello world";

Thì cấu trúc của gói tin trả về như sau:

HTTP/1.1 200 OK
Server: nginx/1.17.6
Content-Type: text/html
Connection: keep-alive

Hello world

Dòng header khác này, có thể có hoặc không có, hoặc có nhiều hơn các thông tin – chỉ thị khác. Vì vậy trong các ví dụ sau mình giảm bớt các dòng header không liên quan tới nội dung bài viết.

Server: nginx/1.17.6
Content-Type: text/html
Connection: keep-alive

Nếu chúng ta đặt lệnh header phía trước lệnh echo sẽ thành ra như thế này:

<?php
header("Location: /index.php");
echo "Hello world";

Thì cấu trúc của gói tin trả về như sau:

HTTP/1.1 200 OK
Location: /index.php

Hello world

Vậy nếu ta đổi ngược 2 lệnh trên. Thì kết quả sẽ được như sau:

<?php
echo "Hello world";
header("Location: /index.php");

Chúng ta sẽ bị lỗi Warning: Cannot modify header information; Nhưng trong trường hợp tắt warning, website vẫn chạy được.

Trong các trường hợp thực tế, ta hay để code php bên trong đoạn mở như sau:

<html>
<?php
// xử lí ...
header("Location: /index.php");
?>

Như vậy ta cũng bị lỗi Warning: Cannot modify header information;

Chúng ta phải đảm bảo các lệnh header được gọi trước tất cả các output khác.

Lỗi 2: ERR_TOO_MANY_REDIRECTS

Một lỗi thứ 2 thường bị khi sử dụng cách này là lỗi ERR_TOO_MANY_REDIRECTS thường thấy mã lỗi này trên Chrome. Ở các trình duyệt khác, hình thức hiện lỗi có thể khác. Nguyên nhân lỗi là bị điều hướng liên tục.

Ví dụ như trình duyệt đang ở trang index.php, nhưng lại có lệnh header("Location: /index.php");. Vậy là khi ta vào trang index.php lại bị đá về index.php, liên tục như vậy. Đến một số lần quy định, Chrome sẽ không thèm chuyển hướng theo chỉ thị Location header nữa. Mà báo ra lỗi này.

Để giải quyết, chúng ta phải check điều kiện chuyển trang. Nếu đang ở trang hiện tại, thì không được chuyển nữa. Ví dụ như URL hiện tại của chúng ta là http://localhost/index.php thì ta phải kiểm tra thông tin $_SERVER['REQUEST_URI'] cho ta được đoạn sau domain /index.php.

<?php
// file index.php
if ($_SERVER['REQUEST_URI'] != '/index.php') {
	header('Location: /index.php');
}

Nhưng các bạn tự lưu ý là, đối với index.php là 1 trường hợp khá đặc biệt. Vì chúng ta vào url http://localhost/ thì thông thường cũng là truy cập vào file index.php. Tức là tương tự như vào http://localhost/index.php. Lúc này, $_SERVER['REQUEST_URI'] cho chúng ta giá trị là /. Vậy ta sửa lại như sau:

<?php
// file index.php
if ($_SERVER['REQUEST_URI'] != '/index.php'
     && $_SERVER['REQUEST_URI'] != '/' ) {
	header('Location: /index.php');
}

Nếu bạn đang cảm thấy mơ hồ hoặc thấy khó khăn, thì vui lòng đọc tiếp các cách khác bên dưới.

2. Chuyển trang bằng HTML

Ngoài cách điều hướng bằng php, chúng ta có thể dùng html tag. như sau:

<meta http-equiv="refresh" content="0;url=index.php">

Với số 0 là số giây sẽ delay. Sau đó sẽ truyển trang về url được khai báo. Như ta muốn chuyển về google.com sau 5s thì ta sẽ ghi như sau:

<meta http-equiv="refresh" content="5;url=https://google.com">

Với số 0 là chuyển ngay lập tức.

Lưu ý:

Sử dụng cách này các bạn cũng không thể tránh khỏi lỗi chuyển trang liên tục như trên. Khi chuyển trang không chuyển về trang hiện tại.

3. Chuyển trang bằng JavaScript

Chúng ta biết rằng JS được dùng để sử lí giao diện là trùm luôn. Vì vậy chuyển trang đối với JS chỉ là chuyện nhỏ. Cách thực hiện như sau:

<script>
	location.href = '/index.php';
</script>

Lưu ý:

Tương tự, sử dụng cách này các bạn cũng không thể tránh khỏi lỗi chuyển trang liên tục như trên. Khi chuyển trang không chuyển về trang hiện tại.

Tổng hợp

Chuyển trang bằng PHP:

<?php 
header("Location: /index.php");

Chuyển trang bằng HTML:

<meta http-equiv="refresh" content="0;url=index.php">

html Chuyển trang bằng JavaScript:

<script>
	location.href = '/index.php';
</script>

Mọi thắc mắc các bạn vui lòng để lại comment.

Bài viết gốc được đăng tại https://hocmoingay.top/

Người viết Hoàng Phúc

Bình luận