Khi nào dấu gạch chéo (/) cần thiết trong các mẫu mod_rewrite?


10

Dưới đây là một ví dụ từ tài liệu Apache để thực thi tên máy chủ chính tắc:

RewriteCond %{HTTP_HOST} !^www\.example\.com [NC]
RewriteCond %{HTTP_HOST} !^$
RewriteRule ^/?(.*) http://www.example.com/$1 [L,R,NE]

Những gì tôi muốn biết là tại sao /? là cần thiết. Tôi đã thử loại bỏ nó và mọi thứ dường như hoạt động như nhau. Tôi có ấn tượng rằng phần mẫu của quy tắc viết lại được so sánh với những gì xuất hiện sau dấu gạch chéo.

Câu trả lời:


4

Chuỗi {REQUEST_URI} bắt đầu bằng ký tự /. Apache đã thay đổi các công cụ regex khi nó thay đổi các phiên bản, do đó, phiên bản 1 của Apache yêu cầu dấu gạch chéo hàng đầu trong khi Apache 2 cấm nó! Chúng tôi có thể đáp ứng cả hai phiên bản bằng cách tạo dấu gạch chéo hàng đầu tùy chọn với biểu thức ^ /? (? là metacharacter cho số không hoặc một trong các ký tự trước).

Nguồn: http://www.sitepoint.com/apache-mod_rewrite-examples/

Một vài tài nguyên nói về dấu gạch chéo hàng đầu

http://forum.modrewrite.com/viewtopic.php?f=4&t=4627

http://net.tutsplus.com/tutorials/other/a-deeper-look-at-mod_rewrite-for-apache/


Nhưng tài liệu Apache 2.2 có nhiều ví dụ với ^ /. Ví dụ: phần RewriteCond có : RewriteRule ^/$ /homepage.std.html [L]. Đó có phải là một lỗi tài liệu?
Matthew Flaschen

Hóa ra (như tôi vừa thử nghiệm) rằng hàng đầu / (^ /) là bắt buộc, ít nhất là trong bối cảnh Virtualhost. Tôi đã không kiểm tra các bối cảnh khác.
Matthew Flaschen

8

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 RewriteRuletrong 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/applechuỗ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ó 0dấu gạch chéo và nếu xuất phát từ virtualhost thì nó sẽ có 1dấu gạch chéo.


Đọc liên quan:

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.