RewriteRule ^([^/]+)(/([^/]+))? pages.php?PAGE=$1&LINK=$3 [L]
"Vấn đề" với điều này là nó cũng sẽ khớp với yêu cầu cho /John Smith
(nhóm thứ 2 là tùy chọn), nhưng viết lại yêu cầu thành pages.php?PAGE=john-smith&LINK=
, thay vì pages.php?LINK=john-smith
theo yêu cầu. Đối với điều này, bạn sẽ cần một quy tắc riêng. Nó cũng phù hợp /profile/john-smith/bất cứ thứ gì
, loại bỏ /bất cứ điều gì
nhưng vẫn viết lại yêu cầu (mối quan hệ nhiều với một) có khả năng mở trang web của bạn cho những kẻ gửi thư rác.
Giả sử bạn không cho phép dấu chấm (.
) trong các phân đoạn đường dẫn URL (theo ví dụ của bạn) thì không cần kiểm tra xem yêu cầu có ánh xạ tới tệp hay không. ví dụ. một yêu cầu cho /hồ sơ/john-smith
không bao giờ có thể ánh xạ tới tệp nếu tất cả các tệp của bạn đều có phần mở rộng tệp, vì vậy việc kiểm tra hệ thống tệp là không cần thiết.
Thay vào đó, hãy thử những cách sau:
# Viết lại chính xác một đoạn đường dẫn
# ví dụ. /john-smith to pages.php?LINK=john-smith
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/.]+)$ pages.php?LINK=$1 [L]
# Viết lại chính xác hai đoạn đường dẫn
# ví dụ. /profile/john-smith tới pages.php?PAGE=profile&LINK=john-smith
RewriteCond %{REQUEST_URI} !^/pages/ [NC]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/.]+)/([^/.]+)$ pages.php?PAGE=$1&LINK=$2 [L]
Các NC
cờ trên trước viết lạiđiều kiện
chỉ thị có lẽ là dư thừa.
([^/.]+)
- Tôi đã thay đổi mô hình con chụp để loại trừ các dấu chấm. Và quy tắc thứ hai khớp chính xác hai đoạn đường dẫn, không phải một hoặc hai đoạn đường dẫn, như trong ví dụ của bạn.