Có thể, nhưng bạn cần sử dụng Bản đồ ghi lại
để xác định ánh xạ mà bạn có thể sử dụng trong RewriteRule
.
Apache phiên bản 2.2 không có quyền truy cập cơ sở dữ liệu trực tiếp, vì vậy bạn sẽ cần viết một tập lệnh thực hiện truy vấn thực tế sau đó trả về kết quả. Bạn có thể xác định bản đồ này bằng cách sử dụng "Chương trình viết lại bên ngoài" .
Vì vậy, nếu bạn có một tập lệnh lấy "mèo" từ stdin, sau đó truy vấn cơ sở dữ liệu và trả về "1", bạn sẽ định nghĩa nó như vậy:
RewriteMap item_lookup prg:/path/to/item_lookup.php
Chỉ thị đó phải có trong máy chủ hoặc cấu hình vhost của bạn, không thể có trong tệp htaccess. Nhưng bạn có thể sử dụng ánh xạ trong tệp htaccess:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /item.php?id=${item_lookup:$1} [L]
Vì vậy, điều này lấy URI /cats
và viết lại thành /item.php?id=1
.
Nếu bạn đang sử dụng apache 2.4 thì bạn có thể tận dụng " DBD "bản đồ . Bạn có thể chèn một truy vấn ngay vào định nghĩa bản đồ, bỏ qua việc phải sử dụng tập lệnh bên ngoài. Bạn sẽ sử dụng nó theo cách tương tự.
RewriteMap item_lookup "fastdbd:SELECT id FROM items WHERE name = %s"
Sau đó, sử dụng nó theo cách tương tự:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /item.php?id=${item_lookup:$1} [L]
Nếu không sử dụng truy vấn DBD / FastDBD, tôi nghĩ bạn nên thực hiện tra cứu cơ sở dữ liệu từ item.php
, vì dù sao thì bạn cũng sẽ sao chép tất cả công việc đó trong một tập lệnh bên ngoài thứ hai. Chỉ cần thêm một cái gì đó như:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^item/([0-9]+)$ /item.php?id=$1 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([A-Za-z0-9-]+)$ /item.php?name=$1 [L]
Và trong item.php
của bạn script, hãy kiểm tra cả id và tên . Nếu bạn có tên , thực hiện tra cứu cơ sở dữ liệu để biến nó thành id. Quản lý dễ dàng hơn nhiều, bạn không cần phải có quyền truy cập cấu hình máy chủ / vhost và bạn không làm phức tạp vấn đề bằng cách sử dụng bản đồ viết lại.