Viết lại với mod_rewite của Apache

Một phần của tài liệu Giáo trình Phát triển ứng dụng web: Phần 2 - Lê Đình Thanh, Nguyễn Việt Anh (Trang 96 - 100)

VIẾT LẠI VÀ ĐỊNH TUYẾN URL

9.2.2. Viết lại với mod_rewite của Apache

Tùy vào môđun viết lại, cú ph{p luật viết lại có thể kh{c nhau ít nhiều. Với mơđun viết lại mod_rewrite cho Apache, luật viết lại có cú ph{p nhƣ sau:

(RewriteCond TestString CondPattern ([c-flags])?)* RewriteRule (!)? Pattern Substitution ([r-flags])?

WebAppDevLê Đình Thanh, Nguyễn Việt Anh

181

trong đó, RewriteRule và RewriteCond l| c{c chỉ dẫn (directives) lần lƣợt cho biết nội dung (c{ch sửa đổi URL) v| điều kiện {p dụng luật, Pattern và CondPattern là c{c biểu thức chính quy, TestString và Substitution là c{c x}u ký tự với một v|i cấu trúc mở rộng. Mỗi luật chỉ có duy nhất một chỉ dẫn RewriteRule, nhƣng có thể khơng có hoặc có nhiều chỉ dẫn RewriteCond.

Tạm thời bỏ qua c{c cờ (c-flags và r-flags), luật viết lại với cú ph{p nhƣ trên có nghĩa là ‚Nếu tất cả RewiteCond đƣợc thỏa mãn (TestString khớp với CondPattern), đồng thời URL v|o khớp (hoặc khơng khớp, nếu có dấu ! phía trƣớc) với Pattern

thì Substitution trở th|nh URL ra. Ngƣợc lại, URL v|o trở th|nh URL ra, tức URL

không bị thay đổi‛.

Trong luật viết lại, Pattern và CondPattern là các biểu thức chính quy, hay là xâu ký tự có thể bao gồm cả ký tự nguyên thủy (literal) v| c{c ký tự hay biểu thức đại diện, đƣợc sử dụng để biểu diễn URL. Dƣới đ}y l| một v|i ký tự v| biểu thức đại diện hay đƣợc sử dụng:

Cú pháp Ý nghĩa

. Ký tự bất kỳ.

[string] Bất kỳ ký tự n|o thuộc string.

[^string] Bất kỳ ký tự n|o kh{c c{c ký tự thuộc string.

(text) Nhóm văn bản.

text1|text2 text1 hoặc text2.

? 0 hoặc 1 lần xuất hiện của văn bản phía trƣớc.

* 0 hoặc N lần xuất hiện của văn bản phía trƣớc (N>0).

+ 1 hoặc nhiều lần xuất hiện của c{c văn bản phía trƣớc.

^ Bắt đầu liên kết.

$ Kết thúc liên kết.

\char Ký tự đặc biệt char.

Ví dụ, ^/wiki/.*$ là một biểu thức chính quy biểu diễn đƣờng dẫn của URL.

Đƣờng dẫn /wiki/Semantic_URL khớp với biểu thức chính quy n|y, nhƣng đƣờng dẫn /wiki-Semantic_URL thì khơng. Ví dụ kh{c, ^/su-kien/.*-[0-9]+\.htm$ khớp hay

đo{n nhận c{c đƣờng dẫn /su-kien/mien-bac-mien-trung-mua-lon-trong-ngay-trung-

thu-20171004080130699.htm và /su-kien/bao-dan-tri-tang-qua-trung-thu-cho-cac-em-co-

hoan-canh-kho-khan-20171004065430012.htm nhƣng không khớp với đƣờng dẫn /su- kien/987-error.htm.

WebAppDevLê Đình Thanh, Nguyễn Việt Anh

182

Ngƣời đọc đƣợc khuyến nghị tham khảo c{c s{ch về ngơn ngữ hình thức v|

otomat để có hiểu biết đầy đủ về biểu thức chính quy cũng nhƣ văn phạm.

Quay lại với luật viết lại, TestString và Substitution là c{c x}u ký tự có thể chứa

các cấu trúc mở rộng (expansion) sau:

Mở rộng Ý nghĩa

$N (0 ≤ N ≤ 9) Tham chiếu ngƣợc đến nhóm thứ N trong

Pattern.

%N (0 ≤ N ≤ 9) Tham chiếu ngƣợc đến nhóm thứ N trong

CondPattern liền trƣớc.

${map:key|default} Gi{ trị phần tử có khóa key trong ánh xạ map,

hoặc default nếu trong map khơng có phần tử có

khóa là key.

%{SERVER_VARIABLE} Biến server.

Ví dụ, nếu Pattern là ^/std/[A-Za-z\-]+_(.*)\.html$ và Substitution là

/std/viewStd.php?std_id=$1 thì $1 trong Substitution l| tham chiếu ngƣợc đến nhóm

(.*) của Pattern. Nếu URL đầu vào là /std/Tran-Van-Binh_012345.html thì nó khớp

với Pattern v| khi đó URL đầu ra là /std/viewStd.php?std_id=012345. Ví dụ kh{c,

nếu tên miền của ứng dụng l| xyz.com Substitution

https://%{HTTP_HOST}/std/list thì URL đầu ra l| https://xyz.com/std/list.

Để sử dụng ánh xạ trong TestString và Substitution, chỉ dẫn RewriteMap với cú

pháp RewriteMap name type:source cần đƣợc viết trƣớc để tạo {nh xạ, trong đó,

name, type, source lần lƣợt l| tên đặt cho {nh xạ, kiểu v| đƣờng dẫn tệp nguồn

chứa nội dung (c{c cặp khóa v| gi{ trị) của {nh xạ. Ví dụ, cho tệp productmap.txt với nội dung nhƣ sau:

television 993 stereo 198 fishingrod 043 basketball 418 telephone 328

Mỗi dịng trong tệp chứa một khóa v| gi{ trị tƣơng ứng với khóa. Có thể sử dụng nội dung tệp n|y để tạo một {nh xạ có tên l| product2id nhƣ sau:

RewriteMap product2id txt:productmap.txt

Khi đó, với luật viết lại

RewriteRule ^/product/(.*)$ /prods.php?id=${product2id:$1|0}

các URLs /product/television, /product/basketball, /product/mobilefone sẽ lần lƣợt đƣợc

WebAppDevLê Đình Thanh, Nguyễn Việt Anh

183

C{c cờ trong luật viết lại đƣợc tóm tắt nhƣ sau:

c-flags Ý nghĩa

nocase | NC Không ph}n biệt chữ hoa, chữ thƣờng khi so s{nh TestString

với CondPattern.

ornext | OR Kết hợp theo biểu thức logic OR với điều kiện liền sau.

‚‛ (Cờ để trắng hay khơng có cờ) Kết hợp theo biểu thức logic AND với điều kiện liền sau.

r-flags Ý nghĩa

nocase|NC Không biệt chữ hoa, chữ thƣờng khi so s{nh.

chain|C Tạo chuỗi luật với luật tiếp theo. Nếu một luật khi so s{nh

khơng khớp, c{c luật phía sau trong chuỗi sẽ bị bỏ qua.

last|L Dừng qu{ trình viết lại URL, khơng {p dụng thêm luật trong

chuỗi luật.

next|N Quay về luật thứ nhất.

forbidden|F Trả về đ{p ứng HTTP với 403.

gone|G Trả về đ{p ứng HTTP với mã 410.

redirect|R Chuyển hƣớng.

skip|S = n Bỏ qua n luật tiếp theo nếu luật hiện tại so khớp.

Ngo|i c{c chỉ dẫn đã đƣợc giới thiệu ở trên, môđun viết lại cung cấp nhiều chỉ dẫn kh{c cho việc tạo luật viết lại. Ví dụ, chỉ dẫn RewriteEngine cho phép hay tắt chế độ viết lại, chỉ dẫn RewriteBase cho biết tiền tố của URL đƣợc dùng trong các luật. Ngƣời đọc quan t}m đến những chỉ dẫn khác có thể tham khảo tại

http://httpd.apache.org/docs/current/mod/mod_rewrite.html.

Trong triển khai ứng dụng web với trình phục vụ Apache và mơđun viết lại

mod_rewrite, c{c luật viết lại đƣợc đặt trong c{c tệp .htaccess. Thông thƣờng, ứng

dụng chỉ cần một tệp .htaccess ở thƣ mục gốc để chứa c{c luật viết lại. Tuy nhiên, từng thƣ mục con có thể có tệp .htaccess riêng. Mỗi tệp .htaccess có t{c dụng cấu hình cho thƣ mục chứa nó cùng c{c thƣ mục con bên trong. Trƣớc đó, mơđun viết lại cần đƣợc cấu hình để có hiệu lực (trên Linux, chạy lệnh sudo a2enmod rewrite).

Ngồi ra, trong tệp cấu hình, thƣ mục gốc của ứng dụng cần đƣợc cấu hình với c{c chỉ thị Options và AllowOverride có nội dung nhƣ sau:

1. <Directory /path/to/home/folder/>

2. Options Indexes FollowSymLinks

3. AllowOverride All

WebAppDevLê Đình Thanh, Nguyễn Việt Anh

184

Một phần của tài liệu Giáo trình Phát triển ứng dụng web: Phần 2 - Lê Đình Thanh, Nguyễn Việt Anh (Trang 96 - 100)

Tải bản đầy đủ (PDF)

(126 trang)