2012-02-13 34 views
14

Tôi có một loạt quy tắc trong .htaccess (tên miền phụ, thư mục, thư mục người dùng cụ thể, v.v.).htaccess cụm từ thông dụng khác nhau/ưu/khuyết điểm

và bây giờ tôi đang sử dụng cụm từ thông dụng này:

([a-z0-9A-Z])

tôi đang tìm kiếm một quy tắc cụ thể và tôi tìm thấy nhiều cách để xây dựng nó và tôi đã tự hỏi nếu có một tiêu chuẩn thực hành cho các? sự khác biệt/ưu/nhược điểm của việc sử dụng một cái gì đó giống như là gì:

  • ([^.]+)
  • ([^/]+)
  • (.*)
  • ([a-z0-9]+)
+2

Điều này có thể giúp: http://stackoverflow.com/questions/8145128/htaccess-mod-rewrite-performance –

+1

Công cụ regexp của Apache chỉ là cùng một công cụ PCRE như trong PHP và Perl. Lời khuyên của tôi là giữ nó đơn giản ngu ngốc. Tất nhiên là một người đơn giản, ... Ví dụ IMHO, '\ w' dễ đọc hơn' [a-z0-9A-Z] '. Đây là "ý nghĩa của cuộc sống" Q. SO không phải là về triết học. – TerryE

+1

Tôi nghĩ Perl không thực sự sử dụng PCRE. – 0xC0000022L

Trả lời

32

Hãy nói rằng chúng tôi có .htaccess này:

RewriteRule ^index\.php$ - [L] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ index.php?request=$1 [L] 

Khái niệm mentionned trong câu hỏi của bạn sẽ có logic sau đây:

^$

  • . (*.): Phù hợp với bất kỳ ký tự và bất cứ ký tự đơn
  • *: phù hợp không hay nhiều của biểu tượng trước đó

Về cơ bản, nó sẽ khớp với bất kỳ thứ gì như:

  • folder1/file1.html: $ 1 sẽ folder1/file1.html
  • file1.html: $ 1 sẽ file1.html

Bằng cách này nó là rất dễ dàng để phân tích toàn bộ yêu cầu trong PHP hay Python. Mặt khác, bạn không lọc bất kỳ ký tự không mong muốn nào trong URL mà bạn sẽ phải xác thực trong tập lệnh của mình.

Ví dụ: [email protected]*-+

([^.] +)

  • []: Cho kết quả bất kỳ trong những biểu tượng bên trong quảng trường niềng răng
  • [^]: phù hợp với bất kỳ ký tự khác ngoài những gì được liệt kê bên trong niềng răng (ref).
  • +: khớp một hoặc nhiều ký hiệu trước đây
  • [^.]: khớp với bất kỳ thông tin nào khác ngoài ký tự ..Sẽ ngừng kết hợp khi tìm thấy một ký tự .

Từ ref.

Ký tự đặc biệt hoặc siêu ký tự duy nhất bên trong một lớp ký tự là dấu ngoặc đóng (]), dấu gạch chéo ngược(), dấu mũ (^) và dấu nối (-). Các siêu ký tự thông thường là các ký tự bình thường bên trong một lớp ký tự, và không cần phải được thoát bằng dấu gạch chéo ngược. Để tìm kiếm dấu sao hoặc dấu cộng, hãy sử dụng [+ *]. Regex của bạn sẽ làm việc tốt nếu bạn thoát khỏi metacharacters thường xuyên bên trong một lớp nhân vật, nhưng làm như vậy làm giảm đáng kể khả năng đọc.

Về cơ bản nó sẽ phù hợp với bất cứ điều gì như:

  • folder1/file1.html: $ 1 sẽ folder1/file1
  • file1.html: $ 1 sẽ file1

Đây là hiệu ứng giống như người đầu tiên, ngoại trừ này xóa mọi thứ sau dấu chấm .

^([^ /] +) $

  • []: phù hợp với bất kỳ của những biểu tượng bên trong quảng trường niềng răng
  • +: phù hợp với một hoặc nhiều hơn các biểu tượng trước
  • ^: phù hợp với bắt đầu của một chuỗi
  • [^/]: khớp với bất kỳ thông tin nào khác ngoài ký tự /. Sẽ ngừng kết hợp khi một ký tự / được tìm thấy

Điều này cũng giống như tác dụng đầu tiên ngoại trừ việc này sẽ kiểm tra mọi yêu cầu đến số /. Vì vậy, nếu bạn có nhiều thư mục, bạn sẽ phải bao gồm nhiều lần regex này.

Về cơ bản nó sẽ phù hợp với bất cứ điều gì tương tự (nếu bạn chỉ có một bộ):

  • folder1/file1.html: $ 1 sẽ folder1
  • file1.html: $ 1 sẽ file1.html

và nếu bạn có 2 :

  • folder1/file1.html: $ 1 sẽ folder1 và $ 2 sẽ phù hợp file1.html
  • file1.html: $ 1 sẽ file1.html

Các thư mục hơn bạn có, càng có nhiều quy tắc bạn có thể phải thêm.

^([a-z0-9] +) $ [^([a-z0-9.] +) $ ví dụ này]

  • []: phù hợp với bất kỳ của những biểu tượng bên trong quảng trường niềng răng
  • +: phù hợp với một hoặc nhiều hơn các biểu tượng trước
  • a-z: Kết hợp chữ từ a đến z
  • 0-9: số trận đấu từ 0-9

(Bạn cũng có thể sử dụng \ d hoặc \ w)

Về cơ bản nó sẽ phù hợp với bất cứ điều gì tương tự (nếu bạn chỉ có một bộ - thêm dấu chấm):

  • folder1/file1.html: $ 1 sẽ folder1
  • file1.html: $ 1 sẽ file1.html

và nếu bạn có 2:

  • folder1/file1.html: $ 1 sẽ folder1 và $ 2 sẽ phù hợp file1.html
  • file1.html: $ 1 sẽ file1.html

Cái này hoạt động như trước, ngoại trừ bạn phải xác định các ký tự mà bạn muốn. Vì vậy, khi bạn kiểm tra chuỗi của bạn trong PHP bạn biết những ký tự bạn nhận được. Giống như trong ví dụ của tôi với tên tệp tôi đã thêm \. để nó nhận ra dấu chấm. Điều này cũng nhanh hơn để thực hiện.

Xem điểm chuẩn: .htaccess mod_rewrite performance

Vì vậy, nếu bạn biết những gì loại yêu cầu bạn sẽ giúp bạn luôn có thể sử dụng các tác phẩm mới nhất nhưng nếu bạn không chắc chắn, bạn sẽ phải chọn một trong đó phù hợp hơn nhu cầu của bạn. Có thể có nhiều sự khác biệt giữa tất cả chúng nhưng mục tiêu chính là hiểu được những gì chúng làm hoặc bắt được. Ngoài ra, hiệu suất là một cái gì đó bạn cần phải xem xét. Kết hợp mọi thứ, sau đó phân tích cú pháp yêu cầu trong PHP hoặc Python có thể mất nhiều thời gian hơn so với chỉ đơn giản là kết hợp chúng lúc đầu và chỉ cần sử dụng chúng trong tập lệnh của bạn.

Các vấn đề liên quan