Để hiểu mod_rewrite trước tiên bạn cần hiểu cách thức hoạt động của một máy chủ web. Một máy chủ web đáp ứng các yêu cầu HTTP . Một yêu cầu HTTP ở mức cơ bản nhất của nó trông như thế này:
GET /foo/bar.html HTTP/1.1
Đây là yêu cầu đơn giản của trình duyệt đến máy chủ web yêu cầu URL /foo/bar.html
từ nó. Điều quan trọng là phải nhấn mạnh rằng nó không yêu cầu một tệp , nó chỉ yêu cầu một số URL tùy ý. Yêu cầu cũng có thể như thế này:
GET /foo/bar?baz=42 HTTP/1.1
Đây chỉ là một yêu cầu hợp lệ cho một URL và rõ ràng nó không liên quan gì đến các tệp.
Máy chủ web là một ứng dụng lắng nghe trên một cổng, chấp nhận các yêu cầu HTTP đến trên cổng đó và trả về phản hồi. Một máy chủ web hoàn toàn miễn phí để đáp ứng bất kỳ yêu cầu nào theo bất kỳ cách nào nó thấy phù hợp / theo bất kỳ cách nào bạn đã cấu hình nó để đáp ứng. Phản hồi này không phải là một tệp, đó là phản hồi HTTP có thể có hoặc không liên quan gì đến các tệp vật lý trên bất kỳ đĩa nào. Một máy chủ web không phải là Apache, có nhiều máy chủ web khác, tất cả chỉ là các chương trình chạy liên tục và được gắn vào một cổng đáp ứng các yêu cầu HTTP. Bạn có thể tự viết một cái. Đoạn này có ý định ly dị bạn với bất kỳ khái niệm nào rằng các URL trực tiếp bằng các tệp, điều này thực sự quan trọng để hiểu. :)
Cấu hình mặc định của hầu hết các máy chủ web là tìm kiếm một tệp khớp với URL trên đĩa cứng. Nếu gốc tài liệu của máy chủ được đặt thành, giả sử /var/www
, nó có thể xem liệu tệp /var/www/foo/bar.html
có tồn tại hay không và phục vụ nó nếu có. Nếu tệp kết thúc bằng ".php", nó sẽ gọi trình thông dịch PHP và sau đó trả về kết quả. Tất cả các hiệp hội này là hoàn toàn cấu hình; một tệp không phải kết thúc bằng ".php" để máy chủ web chạy nó thông qua trình thông dịch PHP và URL không phải khớp với bất kỳ tệp cụ thể nào trên đĩa để xảy ra sự cố.
mod_rewrite là một cách để viết lại xử lý yêu cầu nội bộ. Khi máy chủ web nhận được yêu cầu về URL /foo/bar
, bạn có thể viết lại URL đó thành một thứ khác trước khi máy chủ web sẽ tìm một tệp trên đĩa để khớp với nó. Ví dụ đơn giản:
RewriteEngine On
RewriteRule /foo/bar /foo/baz
Quy tắc này cho biết bất cứ khi nào một yêu cầu khớp với "/ foo / bar", hãy viết lại thành "/ foo / baz". Yêu cầu sau đó sẽ được xử lý như thể /foo/baz
đã được yêu cầu thay thế. Điều này có thể được sử dụng cho các hiệu ứng khác nhau, ví dụ:
RewriteRule (.*) $1.html
Quy tắc này khớp với bất cứ thứ gì ( .*
) và bắt nó ( (..)
), sau đó viết lại để thêm ".html". Nói cách khác, nếu /foo/bar
là URL được yêu cầu, nó sẽ được xử lý như thể /foo/bar.html
đã được yêu cầu. Xem http://THER-expressions.info để biết thêm thông tin về kết hợp biểu thức chính quy, chụp và thay thế.
Một quy tắc khác thường gặp là:
RewriteRule (.*) index.php?url=$1
Điều này, một lần nữa, phù hợp với bất cứ điều gì và viết lại nó vào tệp index.php với URL được yêu cầu ban đầu được nối vào url
tham số truy vấn. Tức là, đối với bất kỳ và tất cả các yêu cầu đến, tệp index.php được thực thi và tệp này sẽ có quyền truy cập vào yêu cầu ban đầu $_GET['url']
, vì vậy nó có thể làm bất cứ điều gì nó muốn với nó.
Chủ yếu bạn đặt các quy tắc viết lại này vào tập tin cấu hình máy chủ web của bạn . Apache cũng cho phép * bạn đặt chúng vào một tệp được gọi .htaccess
trong tài liệu gốc của bạn (tức là bên cạnh các tệp .php của bạn).
* Nếu được cho phép bởi tệp cấu hình chính của Apache; đó là tùy chọn, nhưng thường được kích hoạt.
Những gì mod_rewrite không làm
mod_rewrite không kỳ diệu làm cho tất cả các URL của bạn "đẹp". Đây là một sự hiểu lầm phổ biến. Nếu bạn có liên kết này trong trang web của bạn:
<a href="https://stackoverflow.com/my/ugly/link.php?is=not&very=pretty">
không có gì mod_rewrite có thể làm để làm cho nó đẹp. Để làm cho điều này một liên kết đẹp, bạn phải:
Thay đổi liên kết thành một liên kết đẹp:
<a href="https://stackoverflow.com/my/pretty/link">
Sử dụng mod_rewrite trên máy chủ để xử lý yêu cầu tới URL /my/pretty/link
bằng bất kỳ một trong các phương pháp được mô tả ở trên.
(Người ta có thể sử dụng mod_substitute
kết hợp để chuyển đổi các trang HTML đi và các liên kết có trong đó. Mặc dù điều này là nỗ lực hơn bình thường so với việc chỉ cập nhật tài nguyên HTML của bạn.)
Có rất nhiều mod_rewrite có thể thực hiện và các quy tắc khớp rất phức tạp mà bạn có thể tạo, bao gồm xâu chuỗi nhiều lần viết lại, yêu cầu ủy quyền cho một dịch vụ hoặc máy hoàn toàn khác, trả lại mã trạng thái HTTP cụ thể dưới dạng phản hồi, chuyển hướng yêu cầu, v.v. Nó rất mạnh mẽ và có thể được sử dụng để rất tốt nếu bạn hiểu cơ chế phản hồi yêu cầu HTTP cơ bản. Nó không tự động làm cho các liên kết của bạn đẹp.
Xem tài liệu chính thức cho tất cả các cờ và tùy chọn có thể.