Gần đây tôi đã xảy ra vấn đề này. Có một sự khác biệt giữa việc sử dụng RewriteRule
trong Virtualhost và là một phần của tệp .htaccess. Quy tắc sau sẽ khớp (với một URL như thế này example.com/fruit/apple
:) nếu nó xuất hiện trong tệp .htaccess:
RewriteRule ^(fruit|fruits)/apple http://newfruitwebsite.com$1 [R=301,L]
nhưng sẽ không khớp trong bối cảnh Virtualhost. Nếu chúng ta kiểm tra tài liệu apache, chúng ta có thể thấy rằng:
Khi sử dụng công cụ ghi lại trong các tệp .htaccess, tiền tố trên mỗi thư mục sẽ tự động bị xóa cho khớp mẫu RewriteRule và tự động thêm sau khi bất kỳ người thân nào (không bắt đầu bằng dấu gạch chéo hoặc tên giao thức) gặp phải kết thúc của bộ quy tắc.
...Nhưng cái đó nghĩa là gì? Quy tắc trên sẽ không khớp với cùng một URL nếu nó được đặt vào Virtualhost vì nó không cho phép dấu gạch chéo ( /
) ở đầu chuỗi. Các tài liệu apache tiếp tục nói:
Tiền tố bị loại bỏ luôn kết thúc bằng dấu gạch chéo, nghĩa là kết hợp khớp với chuỗi không bao giờ có dấu gạch chéo hàng đầu. Do đó, một Mẫu có ^ / không bao giờ khớp trong ngữ cảnh mỗi thư mục.
... Vì vậy, nếu chúng ta cần một dấu gạch chéo cho .htaccess và không có dấu gạch chéo cho Virtualhost, làm thế nào để chúng ta sửa đổi mẫu? Bạn đoán nó Chúng ta cần thêm /?
để thêm điều kiện sau vào regex của chúng ta (trong đó dấu hỏi của chúng ta ( ?
) là bộ định lượng):
- Có từ 0 đến 1
/
ở đầu chuỗi.
Bây giờ example.com/fruit/apple
chuỗi URL ( ) của chúng tôi sẽ khớp bởi vì chúng tôi đang xử lý thực tế là nếu quy tắc nằm trong tệp .htaccess thì nó sẽ có 0
dấu gạch chéo và nếu xuất phát từ virtualhost thì nó sẽ có 1
dấu gạch chéo.
Đọc liên quan:
RewriteRule ^/$ /homepage.std.html [L]
. Đó có phải là một lỗi tài liệu?