Hướng dẫn header location php

Trong bài này chúng ta tìm hiểu về hàm header, đây là một hàm được dùng khá nhiều trong lập trình web, ví dụ như dùng để chuyển hướng trang, dùng để khai báo định dạng file trả về từ Server, ...

Hướng dẫn header location php

Hướng dẫn header location php

Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.

Trong tiếng anh thì có định nghĩa như sau: header() is used to send a raw HTTP header, khái niệm này bạn hãy tự dịch ra chứ mình cũng không biết dịch sao cho sát nghĩa nữa :3

Cú pháp của hàm header như sau:

Bài viết này được đăng tại [free tuts .net]

header ($string, $replace = true, $http_response_code = null) {}

Trong đó:

  • $string: Chuỗi khai báo cho kết quả trả về từ Server, chuỗi này đóng vai trò quan trọng nhất vì nội dung của nó sẽ quyết định header sẽ làm gì.
  • $replace: Tham số này mặc định là true, nghĩa là định dạng của chuỗi $string sẽ được replace chứ không phải khai báo mới (trường hợp khai báo nhiều header).
  • $http_response_code: Mã code trả về từ Server. VD 404 là not found 301 là chuyển hướng có chủ đích

Lưu ý: Cũng như Session trong PHP, bạn phải chắc chắn rằng ở phía trên đoạn code sử dụng header không được xuất ra bất kì một ký tự nào, vì vậy thông thường chúng ta đặt header ở phía trên cùng của file, nơi mà chưa có những đoạn mã HTML.

Và bây giờ chúng ta tìm hiểu một số công dụng của hàm header nhé.

1. Header điều hướng trang

Bạn có thể sử dụng thẻ header để điều hướng, chuyển hướng trang với cú pháp như sau:

header('Location: http://www.domain.net/');

Ví dụ: Chuyển hướng tới trang freetuts.net

header('Location: http://www.freetuts.net/');

Khi chuyển hướng trang với hàm header bạn nên khai báo thêm response_code sẽ tốt hơn rất nhiều cho SEO. Chẳng hạn như bạn thay đổi domain cho website thì khi người dùng vào domain cũ bạn sẽ chuyển hướng nó sang domain mới, lúc này bạn nên sử dụng code là 301 vì đây là code khai báo chuyển hướng có điều kiện.

header('Location: http://www.domain.net/', true, 301);

Còn trường hợp bạn muốn chuyển hướng page not found thì hãy sử dụng mã code 404.

header('Location: http://www.domain.net/', true, 404);

2. Khắc phục lỗi font với hàm header

Bạn có thể sử dụng hàm header để khắc phục tình trạng lỗi font khi trả kết quả về không có định dạng thẻ meta utf8 bằng cách đặt đoạn code sau ở đầu file.

header('Content-Type: text/html; charset=utf-8');

3. Khai báo định dạng file

Để khai báo định dạng file thì ta sử dụng cú pháp sau:

header("Content-type: text/javascript");

Bạn có thể thay đổi text/javascript thành text/css để khai báo đây là file CSS.

Nếu bạn muốn khi người dùng vào file đó thì sẽ download thay vì hiển thị thì hãy sử dụng thẻ header sau:

header("Content-type: application/force-download");
  header("Content-Disposition: attachment; filename=\"download.js\"");

Ngoài ra còn khá nhiều ví dụ và bạn có thể click vào link này để xem thêm.

4. Lời kết

Hàm header này tương đối đơn giản, cái khó chính là cấu trúc của chuỗi header phải khai báo chính xác nên bắt buộc ta phải nhớ cấu trúc của nó. Riêng cá nhân mình thì cũng ít khi nhớ lắm, khi nào cần thì lên Google tìm kiếm là ra ngay.

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.

Nội dung chính

  • 1. Chuyển trang bằng HTTP header
  • Các lỗi thường gặp khi sử dụng chuyển hướng bằng header
  • 2. Chuyển trang bằng HTML
  • 3. Chuyển trang bằng JavaScript
  • Tổng hợp

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: 

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

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.

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

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

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:

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:

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:


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.


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:

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:

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:

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:

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:

Chuyển trang bằng HTML:

html Chuyển trang bằng JavaScript:

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

---

Phuc Tran Hoang


Các bài viết khác