2010-10-01 26 views
15

Tôi đang cố gắng để chuyển hướng một loạt các URL tĩnh, và tôi muốn nó hoạt động hay không dấu gạch chéo là hiện tại:Apache viết lại quy tắc mà làm việc có hoặc không có một dấu gạch chéo

/foo/bar ---> /tacos 
/foo/bar/ --> /tacos 

tôi đã thử những điều sau đây và tất cả các loại biến thể, nhưng tôi luôn nhận được kết quả phù hợp với dấu gạch chéo hiện tại:

RewriteRule ^foo/bar?/$ http://url.com/tacos 
RewriteRule ^foo/bar(?/)$ http://url.com/tacos 
RewriteRule ^foo/bar*/$ http://url.com/tacos 
RewriteRule ^foo/bar(*/)$ http://url.com/tacos 

Tôi cảm thấy mình thiếu một điều gì đó hiển nhiên. Cứu giúp?

Trả lời

27

Khác với trong EBNF hoặc ABNF, một bộ định lượng trong biểu thức chính quy đề cập đến biểu thức trước và không biểu thức sau. Vì vậy:

RewriteRule ^foo/bar/?$ http://url.com/tacos 
+0

Hà, tôi biết đó là một cái gì đó ngu ngốc như thế. :) Cảm ơn! –

+6

Dấu hỏi cho biết "Tôi sẽ có 0 hoặc 1 dấu gạch chéo." Bạn đi đến một nhà hàng và nói "Tôi sẽ có một taco?" Bạn đang thực sự nói "Tôi sẽ có 0 hoặc 1 tacos." – bobobobo

+0

Làm việc tuyệt vời cho chúng tôi. Cảm ơn –

3

Hãy thử

RewriteRule ^foo/bar/?$ http://url.com/tacos 
13

Nếu bạn muốn kết hợp foo/bar bất kể cho dù đó là tiếp theo là một phần của con đường, bạn có thể nói:

RewriteRule ^foo/bar(/.*|$) http://url.com/tacos 

này sẽ phù hợp bất kỳ điều nào sau đây:

foo/bar 
foo/bar/ 
foo/bar/baz 

Nó có nghĩa là: khớp với a) dấu gạch chéo theo sau là 0 hoặc nhiều ký tự, hoặc b) kết thúc chuỗi.

Mặt khác, những có thể không mong muốn:

RewriteRule ^foo/bar/? http://url.com/tacos  # This also matches foo/barb 
RewriteRule ^foo/bar/?$ http://url.com/tacos # This will not match foo/bar/baz 
Các vấn đề liên quan