Htaccess và các vấn đề liên quan

Post on: 2018-08-10 23:46:43 | in: Server
Thông thường để cấu hình cho Server Linux thì ta phải có kiến thức về quản trị mạng Linux, điều này đôi khi gây khó khăn cho các lập trình viên. Vậy có cách nào khắc phục vấn đề này mà không cần

Ở Server có một file đặc biệt tên là .htaccess, file này có nhiệm vụ khai báo cấu hình cho các folder kể từ folder mà nó đang đứng. Ví dụ bạn đang ở folder sources/.htaccess thì tất cả các folder con của folder sources cũng bị ảnh hưởng bởi file này. Bạn có thể khai báo cấm người dùng truy cập vào folder, đặt mật khẩu cho folder, và đặc biệt hơn nữa đó là quản lý đường dẫn như rewrite URL, redirect URL. Đó là đối với Linux, còn đối với Window thì file này sẽ có tên là web.config và tác dụng của nó cũng tương tự, tuy nhiên về cú pháp sử dụng thì hai file .htaccess và web.config sẽ khác nhau.

File .htaccess sử dụng cú pháp của Regular Expression nên để sử dụng thành thạo thì bắt buộc ban phải biết các quy tắc căn bản trong RegExp, bạn không cần phải biết sâu mà chỉ cần biết các cú pháp RegExp căn bản là được. Ngoài ra nó còn có cú pháp riêng mà ban phải học thuộc để biết mà điều hướng đúng cách.

Như vậy công dụng của file .htaccess trong một project PHP là giúp khai báo cấu hình cho project đó như viết lại đường dẫn, bảo mật file, đặt mật khẩu cho file, bật cache client để tối ưu hóa tốc độ cho website. Và trong bài viết này sẽ tổng hợp tất cả các vấn đề này.

Nội dung chính

  1. File htaccess là gì ?
  2. Kiểm soát và bảo mật website với htaccess
  3. Những ký hiệu thường dùng của htaccess

1. htaccess là gì ?

File htaccess là một tập tin dùng để cấu hình máy chủ web apache. Nó được máy chủ chấp nhận như là một thành phần và cho phép chúng ta thực hiện điều hướng và bật các tính năng một cách linh hoạt hoặc bảo vệ một phần (folder) nào đó của trang web.

Trong cái tên .htaccess thì htaccess là phần đuôi và tập tin này là không có tên (noname), chính vì thế khi bạn đưa file này lên host không phải lúc nào nó cũng hiển thị ra. Nên không phải lúc nào bạn cũng có thể thấy file .htaccess được.

File .htaccess không được viết nên từ một ngôn ngữ lập trình nào, nó được viết bởi những quy tắc Regular Expression nên nếu bạn không nắm vững kiến thức này thì thao tác với file .htaccess rất khó khăn. Và nếu bạn chỉnh sửa file với một lỗi dù chỉ là nhỏ thì khi truy cập vào website của bạn sẽ xuất hiện lỗi 500, như vậy là bạn đã HACK được web mình rồi đấy. Vì thế hãy thận trọng khi chỉnh sửa file .htaccess và hãy luôn luôn có một file backup trước khi chỉnh sửa nó.

Có thể sử dụng file .htaccess để viết lại đường dẫn, bảo vệ thư mục và file, bật chức năng cache và gzip giúp tốc độ trang web được cải thiện hơn. Và còn nhiều điều tính năng khác nữa.

2. Bảo mật website với htaccess

2.1. Bật chức năng Rewrite

Để bật chức năng rewrite này ta chỉ cần thêm một đoạn code nhỏ lên đầu file .htacess như sau:

RewriteEngine on

2.2. Xử lý Chuyển hướng lỗi

RewriteEngine on
ErrorDocument 404 http://www.example.com/404.html

Đoạn code trên từ khóa ErrorDocument có ý nghĩa là nếu url request bị lỗi thì xử lý chuyển hướng. Ở đây lỗi có hiệu lực là 404 và link chuyển hướng là http://www.example.com/404.html.

Ví dụ trên tôi đã dùng một địa chỉ đầy đủ (tức là địa chỉ có full url) nhưng nếu ta để ở dạng local thì hay hơn.

ErrorDocument 401 /errir_401.html
ErrorDocument 403 / errir_403.html
ErrorDocument 404 / errir_404.html
ErrorDocument 400 / errir_400.html

Các con số lỗi trên có ý nghĩa như sau:

  • 404 - Not Found
  • 401/403 - Unauthorized/Forbidden
  • 400 - Bad Request
  • 500 - Internal Server Error

Và còn rất nhiêu lỗi khác tôi không thể liệt kê hết được. Nhưng chung quy thì lỗi 404 vẫn là lỗi thông dụng nhất nên các website hiện nay chủ yếu tập trung vào lỗi này.

2.3. Hiển thị trang index giả mạo

Nếu bạn vào một folder nào đó trong website mà không có file index.html thì lúc này tất cả các file hay folder đề bị thấy hết, điều này không tốt lắm vì lộ hết các files và folders. Giải quyết vấn đề này ta dùng file .htaccess với dòng lệnh sau

Options All -Indexes

Dòng lệnh này sẽ hiển thị một thông báo Forbidden thay vì hiển thị cấu trúc folder.

** 2.4. Thiết lập trang index mặc định**

Nếu bạn muốn thiết lập file mặc định thay vì file index.html thì ban bạn thêm đoạn code sau vào file .htaccess:

DirectoryIndex newindex.html

Trong đó newindex.html là tên file bạn muốn thiết lập.

** 2.5. Bảo về file .htaccess **

Như bạn biết file htaccess là một file đặc biệt dùng để cấu hình Server một cách dễ dàng, sẽ rất nguy hiểm nếu hacker tấn công vào file này của bạn. Để bảo vệ fiel này ta dùng đoạn code sau:

<Files .htaccess>
Order Allow,Deny
Deny from all
</Files>

Trong đó file .htaccess là tên file muốn bảo vệ. Nội dung bên trong có nghĩa không cho người nào truy cập đến file này.

Không phải chỉ bảo vệ được file .htaccess mà ta có thể bảo vệ một file bất kì.

** 2.6. Đặt mật khẩu cho folder **

Đôi lúc ta cần đặt mật khẩu bảo vệ một file nào đó, tức là muốn vào file đó thì phải nhập username và password. Để làm được điều này các bạn phải tạo một file với tên .htpasswd tại folder gốc của file bạn muốn bảo vệ sau đó điền nội dung sau.

MyUsername:MyPassword

Trong đó MyUsrename là tên username, MyPassword là mật khẩu, hai giá trị này bạn có thể thay đổi bất kì.

Tiếp theo ở file .htaccess bạn thêm đoạn code sau:

AuthName "Restricted Area"
AuthType Basic
AuthUserFile /demo/.htpasswd
AuthGroupFile /dev/null
<Files file1.php>
require valid-user
</Files>

Trong đó AuthName "Restricted Area" là tên chương trình. /demo/.htpasswd là đường dẫn đến file htpasswd tính từ thư mục chứa file .htaccess. file1.php là tên file muốn bảo vệ.

3. Những ký hiệu thường dùng của htaccess

Để hiểu ra và làm tốt vấn đề này trong htaccess, bạn phải có kiến thức về Regular Expression. Trong khuôn khổ bài viết này, tôi sẽ không giới thiệu lại Regular Expression nữa. Mặc định các bạn đã có kiến thức này rồi.

Tôi sẽ giới thiệu luôn về qui tắc viết biểu thức điều kiện trong htaccess

Ký hiệu [list_char]

Danh sách các ký tự được phép chấp nhận

**Ví dụ: **[abc] => chỉ chấp nhận ký tự a hoặc b hoặc c

Ký hiệu [begin- end]

Dành sách các ký tự bắt đầu từ ký tự BEGIN và kết thúc là ký tự END

Ví dụ:

[a-z] => chấp nhận các ký tự thường từ a đến z
[A-Z] => chấp nhận các ký tự hoa từ A đến Z
[0-9] => chấp nhận các ký tự từ 0 đến 9
[a-c] => chấp nhận các ký tự từ a đến c
[a-zA-Z0-9] chấp nhận các chữ cái thường, hoa và các ký tự số
ký hiệu {min,max}

Xác định chiều dài cho chuỗi tối thiếu mà MIN và tối đa là Max.

** Ví dụ **

[a-z]{5,10} => các ký tự từ a tới z dài từ 5 đến 10 ký tự
[A-Z]{1,100} => các ký tự từ A tới Z dài từ 1 đến 100 ký tự
[0-9]{10} => ký tự số dài 1 ký tự
[a-zA-Z]{1,} => các ký tự chữ hoa hoặc chữ thường dài từ 1 ký tự trở lên
*Ký hiệu ^ và $$

^ là ký hiệu bắt đầu chuỗi

$$là ký hiệu kết thúc chuỗi.

Ví dụ

^[a->z]{10}$ => chuỗi tự bắt  đầu là chữ cái thường, kết thúc cũng là chữ cái thường  và dài 10 ký tự.
^framgia$ => Chuỗi cố định là framgia
^framgia[a-z]{2} chuỗi bắt đầu bằng framgia và kết thúc là 2 ký tự thường
** Ký hiệu dấu chấm (.)**

Ký hiệu dấu chấm (.) đại diện cho ký tự bất kỳ.

Ví dụ

.{10,20} => ký tự bất kỳ dài từ 10 đến 20 ký tự
**ký hiệu + ?, ***
  • Dấu + : xác định chiều dài 1 hoặc nhiều ký tự
  • Dấu ? : xác định chiều dàu 0 hoặc 1 ký tự
  • Dấu * : xác định chiều dài từ 0 hoặc nhiều ký tự

Ví dụ

[a-z]+ => chuỗi các ký tự chữ cái thường từ 1 ký tự trở lên
[a-z]* => chuỗi các ký tự chữ cái thường từ 0 ký tự trở lên
[a-z]? => chuỗi các ký tự chữ cái thường từ 0 đến 1 ký tự
** Ký hiệu ()**

Dùng gom nhóm các group Regular Exprsesion.

Ví dụ

([a-z])([A-Z]): Góm thành 2 nhóm
([a-z][A-Z]): Gom thành 1 nhóm
Ký hiệu [^]

Ngược lại với ký hiệu [], nghĩa là so khớp với những ký tự không nằm trong danh sách cặp [].

Ví dụ

[^a-z]{5,10} => chuỗi dài 5 đến 10 ký tự và không có ký tự chữ cái thường từ a đến z
[^abc]{} => so khớp với chuỗi không chứa chữ cái a, b và c
Ký hiệu |

Đây là toán tử OR trong Regular Expression, có ý nghĩa Regex A hoặc Regex B

(a|b) => là ký tự a hoặc b
(framgia|viblo) => chuỗi framgia  hoặc viblo
*Ký hiệu *

Dùng để đặt trước các ký hiệu đặc biệt trong chuỗi RegEx. Các ký tự đặc biệt là các ký tự nằm trong danh sách ký hiệu của Regular Expression.

\. => ký tự dấu chấm chứ không phải ký hiệu dấu chấm trong RegEx
\[ => ký tự mở ngoặc vuông chứ không phải ký hiệu mở ngoặc vuông trong RegEx
Capturing GROUP

Hiểu đơn giản Capturing Group là thứ tự các group gom nhóm trong chuỗi RegEx, toàn chuỗi là group 0, sau đó đếm theo tứ tự từ trái qua phải để tìm đến các group tiếp theo.

Ví dụ

[a-z]{1,2})([0-9]{10,20}) => có 3 capturing group:

   Thứ nhất là toàn chuỗi regex =>([a-z]{1,2})([0-9]{10,20})
   Thứ 2 là theo thứ tự từ trái qua phải ta gặp group đầu tiên ([a-z]{1,2})
   Thứ 3 là group tiếp theo ([0-9]{10,20})

Ta dùng những Capturing Group này để truyền vào URL khi viết lại đường dẫn (Rewrite Url).

** Các ký hiệu riêng của file htaccess**
  1. [F] - Forbidden: Kí tự này dùng để chỉ định server sẽ trả về client trang lỗi 403 nếu truy cập vào những nơi không được phép.

  2. [L] - Last rule: kí tự này để ấn định rằng bước trước đã xong thì ngừng và không tiếp tục thực thi lệnh rewrite tiếp theo nữa.

  3. [N] - Next: chỉ thị cho server tiếp tục rewrite cho đến rule kế tiếp.

  4. [G] - Gone: Chỉ định server trả về client trang báo lỗi không tồn tại (no longer exit)

  5. [P] - Proxy: chỉ định server điểu kiển các yêu cầu được ấn định bởi mod_proxy

  6. [C] - Chain: Chỉ định server thực hiện rule hiện hành song song với rule trước đó.

  7. [R] - Redirect: chỉ định server đổi hướng request sang một trang khác trong trường hợp trình duyệt gởi yêu cầu duyệt một trang được sửa chữa đường dẫn (rewrite) trước đó.

  8. [NC] - No-case: Chỉ định server match không phân biệt hoa thường.

  9. [PT] - Pass Through: có nghĩa là dùng kí tự để buộc "rewrite engine" ấn định bảng giá trị của uri trở thành giá trị của tên files.

  10. [OR] - Toán tử kiểm tra từ trên xuống dưới, nếu điều kiện nào đúng thì dừng.

  11. [NE] - No Escape: Chỉ định server xử lí các gói tin trả về mà không dùng kí tự thoát

  12. [NS] - No Subrequest: Chỉ định server bỏ qua thư mục hiện hành nếu request nhắm vào thư mục con.

  13. [QSA] - Append Query String: chỉ định server gắn chuỗi truy vấn vào cuối cùng của URL

  14. [S=x] Skip: Chỉ định server bỏ qua không xem xét x rules tiếp theo nữa nếu một rule đã được thực thi.

  15. [T=MIME-type] - Khai báo định dạng files của server.

  16. -d Kiểm tra thư mục có tồn tại hay không?

  17. -f Kiểm tra file có tồn tại hay không

  18. -s Kiểm tra giá trị của file có khác 0 hay không?

Kết luận

Ở bài viết này, tôi đã giới thiệu cho các bạn những kiến thức về htaccess. Mong rằng bài viết này sẽ giúp các bạn giải quyết được những tình huống về htaccess mà các bạn gặp phải trong thực tế.