Sử dụng htaccess trong php

Sử dụng htaccess trong php để thực hiện các hoạt động trước khi code php thực thi. Ví dụ chuyển url, cấm xem file php, khai báo file mặc định…


Sử dụng htaccess trong php


.htaccess là một file đặc biệt, trong đây có nhiều lệnh. 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), và nó chạy trước khi thi hành các lệnh trong file php của bạn. Sau đây là 1 số lệnh thường dùng

Cấm hiện danh sách file Options -Indexes

Khi user request một folder mà folder đó không có file mặc định (index.php, index.html ) thì Apache sẽ hiện ra danh sách các file trong đang có folder cho user xem. Ví dụ folder website của bạn là NC_test, trong đó có folder hinh. Folder hình có nhiều file trong đó nhưng không có file mặc định index.html, index.php. Do đó các file trong folder sẽ hiện hết ra trang web, ai cũng xem được.

Điều này rất không tốt (không bảo mật) nhất là khi đưa website lên host, điều gì xảy ra nhiều mọi người nhìn thấy file .sql?, file chứa các loại username password?

Để không liệt kê các file như trên, bạn tạo file .htaccess trong folder website của mình rồi gõ lệnh sau trong file .htaccess

Options -Indexes

Giờ thì ngon rồi, khi user xem bất kỳ folder nào trong website của bạn mà folder đó không có file mặc định index.html, index.php thì sẽ thấy thông báo thế này, danh sách các file không còn hiện ra nữa.

Còn việc truy xuất tới cụ thể từng file trong folder vẫn diễn ra bình thường.

Bật chế độ chuyển địa chỉ: RewriteEngine On

Trong file .htaccess, có một lệnh bạn cần phải có viết để bật tắt chế độ chuyển địa chỉ của apache:

RewriteEngine on

Chuyển địa chỉ : RewriteRule

Sử dụng htaccess trong php là phải biết lệnh này : RewriteRule. Đây là lệnh giúp chuyển địa chỉ giả (nhưng đẹp) thành địa chỉ thật.

Lệnh chuyển địa chỉ RewriteRule là lệnh dùng phổ biến nhất trong file .htaccess. Nhờ lệnh này mà bạn có thể tạo địa chỉ đẹp để giao tiếp với bên ngoài, địa chỉ đẹp thì có giá trị nhiều cho SEO website. Ví dụ:

RewriteRule ^songdep/$ index.php?view=cat&idloai=12  
RewriteRule ^thohay/$ index.php?view=cat&idloai=28
RewriteRule ^news/(.*).html$ index.php?view=news&slug=$1

Với việc dùng RewriteRule như trên, khi user request songdep/ (địa chỉ giả – nhưng đẹp) sẽ được chuyển thành địa chỉ thật index.php?view=cat&idloai=12 y như user request địa chỉ thật này vậy. Xem hình dưới.

Cú pháp lệnh RewriteRule

Sau đây là cú pháp chung của lệnh RewriteRule

RewriteRule pattern  url [flag]  

pattern: là một mẫu để so khớp với URL hiện hành. Nếu địa chỉ trong request của user khớp với pattern thì việc chuyển địa chỉ sẽ diễn ra.

  • ^  diễn tả vị trí bắt đầu. Ví dụ ^songdep, tức địa chỉ request bắt đầu là songdep
  • $  diễn tả vị trí cuối. Ví dụ .html$ , tức địa chỉ request tận cùng là .html
  • .   diễn tả một ký tự bất kỳ nào đó, ký tự nào cũng được
  • [chars]    diễn tả 1 ký tự nào đó trong dấu []. Ví dụ [ps] , tức p hoặc s
  • text1|text2   : dấu | diễn tả ý nghĩa “hoặc”. text1 hoặc text2
  • ?   diễn tả số lần xuất hiện 0 lần hoặc 1 lần
  • *   diễn tả số lần xuất hiện: 0 lần hoặc nhiều lần của chữ phía trước
  • +   diễn tả số lần xuất hiện: 1 lần hoặc nhiều lần chữ phía trước
  • (text) diễn tả một nhóm ký tự.                     
  • !   dấu này dùng trước parttern để diễn tả ý nghĩa phủ định

 flags là cờ  chỉ định cách hoạt động của lệnh

  •  L  quá trình rewrite dừng lại ở rule này
  •  NC  Không phân biệt chữ hoa thường

url   địa chỉ mới sẽ chuyển đến, trong url có thể dùng các server variables hoặc back reference “%n”  tới các phần trong pattern

Ví dụ sử dụng RewriteRule

Ví dụ 1: Nếu trong file .htaccess bạn nhập lệnh như sau:

RewriteRule ^news/(.*).html$ index.php?view=news&slug=$1 

Thì lệnh trên có nghĩa là khi user request 1 địa chỉ bắt đầu là news, sau đó là 1 nhóm ký tự bất kỳ (.*) , rồi kết thúc bằng .html thì sẽ chuyển vào trang index.php với tham số thứ nhất là view=news. Và tham số thứ hai có tên là slug có giá trị là nhóm ký tự thứ 1 ở phía trước ($1)

<!-- index.php -->
<h1> Đây là trang index.php</h1>
<?php var_export($_GET) ;?>

Ví dụ 2: Nếu trong file .htaccess bạn nhập lệnh như sau:

RewriteRule ^baihoc/(.*)/([1-8]).bh$ baihoc.php?mon=$1&baithu=$2

Thì lệnh trên có nghĩa là khi user request 1 địa chỉ bắt đầu là baihoc , sau đó là 1 nhóm ký tự bất kỳ (.*) , rồi dấu / , rồi sau đó là 1 nhóm ký tự gồm chỉ 1 ký tự 1 đến 8, rồi kết thúc nằng .bh thì sẽ chuyển vào trang baihoc.php với tham số thứ nhất tên là mon có giá trị là nhóm ký tự thứ nhất ($1). Và tham số thứ hai có tên là baithu có giá trị là nhóm ký tự thứ 2 ($2)

<!-- baihoc.php -->
<h3>Trang bài học </h3>
<?php var_export($_GET); ?>

Lệnh điều kiện RewriteCond

RewriteCond là lệnh dùng để diễn tả một điều kiện trong file .htaccess. Lệnh này bạn thường cần tới khi sử dụng htaccess trong php.

RewriteCond được đặt ở trước lệnh RewriteRule để làm điều kiện cho RewriteRule hoạt động. RewriteCond na ná như lệnh if vậy. Có nghĩa là bạn có thể chuyển địa chỉ khi thấy thỏa một điều kiện nào đó. Sau đây là vài ví dụ:

Dùng RewriteCond theo thời gian của server

Dùng các biến %{TIME_HOUR} , %{TIME_MIN} để diễn tả thời gian của server. Căn cứ vào đó để làm cái gì đó trong .htaccess. Ví dụ sau sẽ căn cứ vào khoảng thời gian từ 7 giờ tối đến 7 giờ sáng , user request bất kể trang nào trong website thì cho xem trang index2.php. Còn ban ngày thì cho họ xem trang index.php chẳng hạn

RewriteCond %{TIME_HOUR}%{TIME_MIN} >1900 [OR]
RewriteCond %{TIME_HOUR}%{TIME_MIN} <0700
RewriteRule (.*) index2.php [L]

Dùng RewriteCond theo địa chỉ request của user

Nếu user request một file không tồn tại trong website thì sao? Nếu bạn muốn chuyển về trang chủ thì viết lệnh như sau tron file .htaccess

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [L]

Trên đây chỉ hướng dẫn sử dụng htaccess trong php với vài lệnh thường dùng. Chưa hết đâu. Cần tham khảo thêm mời bạn xem các bài sau: