Sử dụng .htaccess

Sử dụng htaccess giúp tạo nhiều chức năng hữu ích cho website như cấu hình Apache, bảo mật, giả địa chỉ. cấm theo ip/giờ, báo lỗi thân thiện…

Bạn có thể tạo nhiều file htaccess trong một website, mỗi lệnh trong file này là một chỉ thị để yêu cầu webserver Apache thực hiện một việc gì đó. Các lệnh trong file htaccess sẽ ảnh hưởng đến folder chứa file htaccess và các folder con, (không ảnh hưởng đến folder cha)

Các lệnh thường dùng trong file htaccess

1. Khai báo trang mặc định  trong htaccess

Lệnh DirectoryIndex là lệnh dùng để khai báo trang web mặc định cho Apache.

DirectoryIndex tc.php

Nếu user khi request mà không nói rõ tên file (chỉ có tên folder) thì file mặc định sẽ chạy. Ví dụ user request địa chỉ như sau là không có tên file: https://longnv.name.vn/lap-trinh-php/   , khi đó file tc.php trong folder lap-trinh-php sẽ thực thi.

2. Khai báo bảng mã

Lệnh AddDefaultCharset dùng để thông báo cho trình duyệt về bảng mã cần dùng để hiện text trong trình duyệt. Lệnh này rất hữu ích, vì bạn không cần khai báo bảng mã bằng tag meta trong từng trang nữa.

AddDefaultCharset UTF-8

3. Cấm hiện danh sách file

Sử dụng htaccess cấm apache hiện danh sách file đễ tăng tính bảo mật cho website. Là bởi vì khi user request một folder mà folder đó không có trang mặc định, apache sẽ liệt kê các file ra. Hoạt động này rất không tốt (không bảo mật). Bạn nên cấm bằng lệnh Options –Indexes

Options -Indexes

4. Bật tắt chế độ chuyển địa chỉ

Lệnh dùng để bật tắt chế độ chuyển địa chỉ của apache là rewriteengine

RewriteEngine on   | off

5. Lệnh chuyển địa chỉ

Sử dụng htaccess để chuyển địa chỉ giả thành địa chỉ thật là hoạt động phổ biến nhất trong htaccess. Bạn sẽ dùng lệnh rewriterule để chuyển địa chỉ, nó giúp điều chỉnh địa chỉ giả của một url thành địa chỉ thật, giúp địa chỉ đẹp hơn, có giá trĩị nhiều cho SEO.

RewriteRule pattern  url   [flag]   

Trong đó pattern là mẫu theo cú pháp regex diễn tả địa chỉ giả , url là địa chỉ thật, flag là cờ xử lý.

+ pattern: là một regular expression để so khớp với URL hiện hành  
        .                    Diễn tả 1 ký tự bất kỳ
       [chars]          lớp ký tự (một trở đi)
       text1|text2    text1 hoặc text2
       ?                   0 hoặc 1 của text phía trước
       *                   0 hoặc nhiều lần text phía trước
       +                   1 hoặc nhiều lần text phía trước
       (text)             Nhóm ký tự                     
       ^                   Diễn tả sự bắt đầu
       $                   Diễn tả vị trí cuối
      \char              escape từng ký tự đặc biệt:   ".[]()" 
      Ký tự ! có thể được dùng trước parttern đễ diễn tả ý nghĩa phủ định
      + flags là cờ  chỉ định cách hoạt động của chỉ thị này:
     [R] (force Redirect) Yêu cầu trình duyệt tạm chuyển hướng tới 1 địa chỉ khác.
     [F] (force URL to be Forbidden) Điều khiển URL hiện tại thành forbidden. Nó gởi HTTP response, 403 (FORBIDDEN).
     [L] (last rule) Điều khiển quá trình rewrite dừng lại ở rule này
     [NC] (no case)  Không phân biệt chữ hoa thường
+ url  là quy tắc thay thế cho địa chỉ gốc do client request. Trong url  có thể dùng các server variables hoặc “tham khảo ngược %N”  tới pattern của rewrite rule

VÍ DỤ:

  • Chuyển địa chỉ 1 loại tin
RewriteRule ^songdep/$ home.php?view=cat&idloai=12 [L]
RewriteRule ^thohay/$ home.php?view=cat&idloai=28 [L]

Chú ý:  url  không được trùng với tên file có thật trong website, và trong trang chủ phải thêm tag:

<base href="http://<?=$_SERVER['SERVER_NAME'];?>/<folder>/"  />
  • Backreference
RewriteRule ^news/(.*).html$ home.php?view=news&tieude_KhongDau=$1
RewriteRule ^cat/(.*)/(.*)/$  home.php?view=cat&Ten_KhongDau=$1&pageNum=$2 [L]
RewriteRule ^cat/(.*)/$  home.php?view=cat&Ten_KhongDau=$1&pageNum=1  [L]
RewriteRule ^search/(.*)/$  home.php?view=search&tukhoa=$1 [L]
  • Đổi tên mở rộng php
RewriteRule ^(.*)\.tto$  $1.php
  • Chuyển hướng tới địa chỉ  khác
RewriteBase /PHP2_htaccess/
RewriteRule ^music/(.*) nhac/$1  [R]
  • Cấm xem 1 địa chỉ
RewriteRule ^Aa\.php$ -  [F,NC]

Chú ý: Khi dùng rewriterule thì địa chỉ giả diễn tả trong pattern không được trùng với tên file có thật trong website, và trong trang chủ cần thêm tag base như sau:

<base href="http://<?=$_SERVER['SERVER_NAME'];?>/<folder>/"  />

6. Lệnh RewriteCond

RewriteCond  %{ Server_variable }   pattern   [flags]

Là lệnh để định nghĩa một điều kiện, lệnh này đặt trước RewriteRule để làm điều kiện cho RewriteRule.

+ flags là cờ đặt sau parttern để điều khiển hoạt động của chỉ thị này. Bao gồm:
[nocase | NC]                        : khớp pattern với url không phân biệt chữ hoa thường
[ornext | OR]                       : Sử dụng để kết hợp với điều kiện phía sa
+ pattern là regexp để so khớp với URL hiện tại, pattern cũng có thể gồm các ký hiệu sau:
-d (is directory) :   Kiểm tra  đường path có phải là folder hay không
-f (is regular file):  Kiểm tra  đường path có phải là 1 file có thực hay không
+ Server_variable gồm các giá trị:
HTTP_USER_AGENT
HTTP_REFERER
HTTP_HOST
REQUEST_URI
REQUEST_FILENAME
REMOTE_ADDR
REMOTE_HOST
REQUEST_METHOD
SCRIPT_FILENAME
QUERY_STRING
DOCUMENT_ROOT
SERVER_NAME
SERVER_ADDR
SERVER_SOFTWARE
TIME_YEAR
TIME_MON
TIME_DAY
TIME_HOUR
TIME_MIN
TIME_SEC

Ví dụ lệnh RewriteCond

  • Căn cứ theo giờ server
RewriteCond %{TIME_HOUR}%{TIME_MIN} >1900 [OR]
RewriteCond %{TIME_HOUR}%{TIME_MIN} <0700
RewriteRule (.*) index_dem.php [L]

7. Lệnh AuthName, AuthType, AuthUSerFile:

Các lệnh này dùng để bảo vệ folder bằng mật khẩu. Để thực hiện, bạn tạo một file .htaccess đặt trong folder bạn muốn bảo vệ rồi thêm những lệnh sau:

AuthName "Phan quan tri"
AuthType Basic
AuthUserFile /full/path/to/.htpasswd
Require valid-user

Có thể thay Phan quan tri  thành text bất kỳ,  /full/path/to là đường dẫn đến file chứa user và mật khẩu. File .htpasswd chứa nhiều dòng, mỗi dòng chứa user và password của user

username:password

VÍ DỤ:

  • Tạo file quantri/.htaccess
AuthName "Phan quan tri"
AuthType Basic
AuthUserFile e://xampp/htdocs/PHP2_htaccess/quantri/.htpasswd
Require valid-user
  • Tạo file quantri/.htpasswd
luom:1

8. Chỉ thị ErrorDocument

ErrorDocument MãLỗi full/path/to/FileThongBao.html

Bạn có thể sử dụng htaccess để có các thông báo lỗi thân thiện với người dùng. Lệnh ErrorDocument giúp thực hiện việc nàt, trong đó FileThongBao.html là trang web mà bạn muốn hiển thị khi lỗi phát sinh,  MãLỗi là một số nguyên. Các mã lỗi http thường gặp là :

400 – Bad request (Lỗi do yêu cầu)
401 – Authorization Required (cần password để truy nhập)
403 – Forbidden (không được vào)
404 – Wrong page (lỗi trang* không tìm thấy…)
500 – Internal Server Error (lỗi server)

VD: Câu lệnh sau trong .htaccess:

ErrorDocument 404 /PHP2_htaccess/error/loi404.html

Khi gặp lỗi không tìm thấy file, browser sẽ tự động chuyển đến trang loi.404.html

Có cách viết thông báo lỗi bằng cách gõ trực tiếp thông báo như sau:

ErrorDocument 404 "No such document here"

9. Chỉ thị deny, allow

Sử dụng htaccess còn giúp bạn cấm/cho phép các ip truy cập website, hay là cấm/cho phép sử dụng theo giờ trong ngày. Bằng cách sử dụng các lệnh allow và deny, bạn có thể thực hiện được. Sau đây là một số ví dụ:

  • Cấm IP, dùng lệnh :
deny from 192.168.8.1
  • Cho phép IP, dùng lệnh:
allow from 00.00.00.00
  • Cấm tất cả IP, dùng lệnh
deny from all
  • Chỉ cho phép một số IP truy cập:
order deny,allow
deny from all
allow from IP
allow from 203.162.*
  • Cấm một số ip truy cập:
order allow,deny
allow from all
deny from IP
deny from 203.162.*

Hai đoạn code trên rất hữu dụng với các WebMaster trong việc bảo mật.Nó sẽ ngăn không cho các IP không hợp lệ vô trang Admin

10. Tham khảo thêm

http://www.htaccesstools.com/


Lab sử dụng htaccess

1. Chuẩn bị

Tạo folder: Trong htdocts, tạo folder PHP2_htaccess, các folder con và các file như sau: (hình tự tìm trên mạng + các file .php thì nhập nội dung giống như tên file nhưng có dấu)

PHP2_htaccess
            .htaccess
            tinxemnhieu.php
            tinnoibat.php
            tin_tc.php
            action.php
            Images
                h1.jpg
                h2.jpg
            Libs
                functions.php
                ham.php
            private
                sales.php

1. Trong file .htaccess, viết lệnh để khi user request file .abc thì đổi thành file tương ứng có đuôi .php

2. Viết lệnh cấm liệt kê các file trong folder khi không có file mặc định

3. Viết lệnh để chỉ định trang mặc định trong folder là trangchu.php

Tự test nhé

4. Viết lệnh yêu cầu trình duyệt sử dụng bảng mã utf-8 khi hiện text

Tự test nhé

5. Viết lệnh để tạo địa chỉ đẹp (tùy ý) cho 2 file tinxemnhieu.php và tinnoibat.php  (dùng lệnh RewriteRule)

6. Viết lệnh để cấm request file action.php

7. Trong khoảng thời gian từ 21 giờ đến 6 giờ sáng, nếu user request bất cứ file nào trong folder private thì chuyển đến trang inx_dem.php ( trang index_dem.php có nội dung: Ban đêm không làm việc nhé)

8. Tạo trang loi404.html và nhập nội dung thông báo + định dạng cho đẹp. Và viết code để khi user request 1  file không tồn tại sẽ chuyển đến trang loi404.html

9. Trong folder Libs, tạo mới 1 file htaccess và viết lệnh cấm user request vào các file trong folder này (lệnh deny)

10. Tạo 1 route http://localhost/PHP2_htaccess/thong-tin-sinh-vien/ , dẫn người xem vào trang sinhvien.php.  Nhập thông tin sinh viên vào trang gồm họ tên, email , điện thoại, hình (file hình đặt trong folder images)