Rewrite URL với rewrite_module
RewriteEngine on4 là một module mở rộng của Server Apache HTTP, nếu có nạp và sử dụng module này nó cho phép bạn viết lại Url. Chức năng chính của nó là ánh xạ một địa chỉ URL đến một vị trí file cụ thể của Server, tuy nhiên bạn có thể làm nhiều hơn thế như chuyển hướng, chặn truy cập ... RewriteEngine on4 phân tích yêu cầu gửi đến bằng cách sử dụng biểu thức chính quy (Xem : Biểu thức chính quy)
RewriteEngine on4 mạnh và mềm dẻo, bạn có thể đưa ra số quy tắc không hạn chế để biến đổi URL, mỗi quy tắc đó cũng hoạt động dựa vào số điều kiện bạn đặt ra một cách không hạn chế.
Sử dụng mod_rewrite ở đâu ? : Nó cung cấp các chỉ thị để bạn sử dụng như RewriteEngine on7, RewriteEngine on8, RewriteEngine on9 ... để bạn viết nó trong RewriteBase URL-path0 hoặc trong file RewriteBase URL-path1 : Nó cung cấp các chỉ thị để bạn sử dụng như RewriteEngine on7, RewriteEngine on8, RewriteEngine on9 ... để bạn viết nó trong RewriteBase URL-path0 hoặc trong file RewriteBase URL-path1
- Nếu chọn viết trong RewriteBase URL-path1, thì các Rewrite có hiệu lực trên thư mục đặt file đó. Khi Apache truy cập đến bất kỳ thư mục con nào thì nó cũng tìm xem trong thư mục đó có file RewriteBase URL-path1 không để nạp vào. Viết cách này khá linh hoạt, nhưng đôi khi làm chậm một chút, nếu có thể ở cấu hình RewriteBase URL-path4 tắt hẳn RewriteBase URL-path1 bằng chỉ thị RewriteBase URL-path6 để chỉ viết trong cấu hình Apache RewriteBase URL-path0
- Các quy tắc ReWrite viết trong RewriteBase URL-path0 ở các RewriteBase URL-path9 của RewriteBase URL-path4, kết quả thì cũng tương tự viết trong RewriteBase URL-path1, nó nhanh hơn vì các luật ReWrite Apache không phải tìm vào nạp mỗi khi truy cập, viết xong phải khởi động lại Apache để có hiệu lực
Nhớ là để sử dụng cần đảm bảo Apache có nạp RewriteEngine Pattern Substitution [flags]2
LoadModule rewrite_module modules/mod_rewrite.soCác chỉ thị rewrite_module
Module rewrite_module cung cấp thêm cho Apache các chỉ thị để dùng gồm: RewriteEngine Pattern Substitution [flags]3 RewriteEngine on9 RewriteEngine on8 RewriteEngine Pattern Substitution [flags]6 RewriteEngine on7 RewriteEngine Pattern Substitution [flags]8
RewriteEngine Pattern Substitution [flags]3 | Bật, tắt Rewrite, nhớ là Rewrite mặc định không có hoạt động cho tất cả thư mục, ở thư mục nào muốn kích hoạt thì bật nên. Tóm ở mỗi thư mục bắt đầu viết các rewrite cần có dòng RewriteEngine on |
RewriteRule ^welcome\.html$ /html/index.html [L]0 | RewriteBase URL-path Thiết lập URL cơ sở cho thư mục |
RewriteEngine on9 | RewriteEngine Pattern Substitution [flags] Chỉ thị này sẽ tiến hành thay thế URL theo cú pháp ở trên, các chuỗi URL gửi đến mà phù hợp với mẫu RewriteRule ^welcome\.html$ /html/index.html [L]2 (mẫu là biểu thức chính quy) thì nó thay thể URL gửi đến thành URL mới là RewriteRule ^welcome\.html$ /html/index.html [L]3, phía sau cú pháp có thể có một số loại cờ thiết lập Ví dụ khi URL gửi đến là RewriteRule ^welcome\.html$ /html/index.html [L]4 thì thực tế Apache sẽ truy cập RewriteRule ^welcome\.html$ /html/index.html [L]5 trên đĩa RewriteRule ^welcome\.html$ /html/index.html [L]Trong đó:
|
RewriteEngine on8 | RewriteCond TestString CondPattern [flags] Viết điều kiện để RewriteEngine on9 phía dưới nó được ứng dụng. Trường hợp đơn giản đầu tiên URI kiểm tra bởi RewriteEngine on8 (có thể kiểm tra URL, Method, biến môi trường ...), nếu điều kiện đúng thì RewriteEngine on9 gần nhất sau RewriteEngine on9 sẽ được dùng để Rewrite. RewriteEngine on8 có kiểm tra điều kiện rất đa dạng, dưới đây là một số thứ có thể tham khảo: RewriteEngine On #Chuyển hướng 1 URL cụ thể RewriteEngine on RewriteRule "^/url-cu\.html$" "url-moi.html" [R=301] #Chuyển hướng thư mục news sang domain (server mới) RewriteRule "^/docs/(.+)" "//new.example.com/docs/$1" [R,L] 5 cờ thiết lập, ví dụ RewriteEngine On #Chuyển hướng 1 URL cụ thể RewriteEngine on RewriteRule "^/url-cu\.html$" "url-moi.html" [R=301] #Chuyển hướng thư mục news sang domain (server mới) RewriteRule "^/docs/(.+)" "//new.example.com/docs/$1" [R,L] 6 toán tử hoặc kết hợp hai RewriteEngine on8 (mặc định là toán từ và. RewriteEngine On #Chuyển hướng 1 URL cụ thể RewriteEngine on RewriteRule "^/url-cu\.html$" "url-moi.html" [R=301] #Chuyển hướng thư mục news sang domain (server mới) RewriteRule "^/docs/(.+)" "//new.example.com/docs/$1" [R,L] 8 phân biệt chữ hoa, thường RewriteEngine On #Chuyển hướng 1 URL cụ thể RewriteEngine on RewriteRule "^/url-cu\.html$" "url-moi.html" [R=301] #Chuyển hướng thư mục news sang domain (server mới) RewriteRule "^/docs/(.+)" "//new.example.com/docs/$1" [R,L] 9 mẫu - biểu thức chính quy để kiểm tra sự phụ hợp của RewriteCond "%{HTTP_HOST}" "!^www\." [NC] RewriteCond "%{HTTP_HOST}" "!^$" RewriteRule "^/?(.*)" "//www.%{HTTP_HOST}/$1" [L,R,NE] 0, hoặc một số giá trị đặc biệt như:
RewriteCond "%{HTTP_HOST}" "!^www\." [NC] RewriteCond "%{HTTP_HOST}" "!^$" RewriteRule "^/?(.*)" "//www.%{HTTP_HOST}/$1" [L,R,NE] 0 chuỗi chứa tham số kiểm tra:
|
Truy cập đến thư mục
Bạn viết Rule đơn giản đầu tiên: Khi truy vấn URI phù hợp với đường dẫn đến file trên đĩa thì có một Rule không thay đổi URI áp dụngKhi truy vấn URI phù hợp với đường dẫn đến file trên đĩa thì có một Rule không thay đổi URI áp dụng
RewriteEngine On RewriteCond %{REQUEST_FILENAME} -s [OR] RewriteCond %{REQUEST_FILENAME} -l [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^.*$ - [L] ...Các RewriteRule khácVí dụ trên mục đích là các truy vấn đến file cụ thể trên đĩa thì không làm gì (RewriteRule có [L], nên nếu là file thật thì quy tắc Rewrite sẽ kết thúc ở đây), nếu không phải là file thì sẽ chuyển sang các RewriteRule
Chuyển hướng URL
Chuyển hướng - Redirect rất hay áp dụng, như
- Xóa (đổi địa chỉ) một URL trên website, nhưng muốn khi người dùng truy cập vào sẽ tự chuyển sang một trang khác
- Chuyển sang một domain mới
Mọi URI không có RewriteEngine on06 (mydomain.com...) chuyển sang có RewriteEngine on06 (www.mydomain.com...)
RewriteCond "%{HTTP_HOST}" "!^www\." [NC] RewriteCond "%{HTTP_HOST}" "!^$" RewriteRule "^/?(.*)" "//www.%{HTTP_HOST}/$1" [L,R,NE]Mọi URI có www sẽ chuyển sang không có www
RewriteEngine on0Tránh mất băng thông
Giả sử trên host của bạn RewriteEngine on08, có một hình ảnh. Nếu một trang nào đó lấy URL ảnh và hiện thị ở trang của họ thì không được phép
RewriteEngine on1Mọi truy vấn khác đều chạy file index.php
Đây là cách PHP hay áp dụng nhất là trong các Framework
RewriteEngine on2Ví dụ trong ZendFramework
RewriteEngine on3Ngoài RewriteEngine on09 Apache còn có RewriteEngine on10, cung cấp chỉ thị RewriteEngine on11, RewriteEngine on12 thay thế cho nhiều trường hợp của RewriteEngine on09, đơn giản hơn hiệu quả hơn. Nên nếu có thể thì áp dụng module này để nâng cao hiệu suất