2010-05-10 27 views
5

Tôi đang sử dụng tập lệnh PHP tự động tạo PNG trong suốt để sử dụng làm hình nền CSS từ chuỗi truy vấn nhận giá trị RGBa và HSLa. Kịch bản gốc có thể được tìm thấy here, tôi chỉ thêm hỗ trợ HSLa.Mod_rewrite với nhiều biến

Bởi vì URL nền với chuỗi truy vấn PHP không đẹp lắm, và vì dường như phá vỡ bản hack PNG 6 trong suốt của IE, tôi nghĩ sử dụng mod_rewrite để cho phép tập lệnh được gọi khi có .png với cú pháp này gọi là:

/assets/colors/h[0-360 value]_s[0-100 value]_l[0-100 value]_a[0-100 value].png 

đó sẽ được viết lại để:

/assets/colors.php?h=[0-360 value]&s=[0-100 value]&l=[0-100 value]&a=[0-100 value] 

Dưới đây là những vấn đề tôi đang gặp phải:

  • đi qua nhiều biến với mod_rewrite
  • sử dụng một dấu gạch dưới như một delimiter

Tôi biết điều này có thể được thực hiện bằng cách thông qua một biến duy nhất và sau đó nổ tung nó trong kịch bản PHP, tuy nhiên tôi muốn nó sẽ được thực hiện bởi Apache.

Xin cảm ơn trước và nếu có ai muốn phiên bản kịch bản HSLa của tôi chỉ cần hỏi. Dù sao tôi khuyên bạn nên kiểm tra nó trên trang web của tác giả.

Trả lời

3

mod_rewrite sẽ khớp với mọi thứ trong dấu ngoặc đơn(), sau đó bạn có thể tham chiếu các giá trị này là $ 1, $ 2, v.v. theo thứ tự chúng được đối sánh. Vì vậy, bạn có thể sử dụng điều này để trích xuất nhiều biến bằng cách chỉ cần đặt chúng trong niềng răng.

Vì vậy, một cái gì đó như thế này sẽ làm việc cho bạn,

RewriteRule ^assets/colors/h([0-9]{1,3})_s([0-9]{1,3})_l([0-9]{1,3})_a([0-9]{1,3}).png assets/colors.php?h=$1&s=$2&l=$3&a=$4 

([0-9]{1,3}) sẽ phù hợp hoặc 1, 2 hoặc 3 của số 0-9 trong một hàng. Vì vậy, "3", "10" và "100", v.v. Nhưng nó cũng sẽ khớp với "999", vì vậy bạn sẽ cần đảm bảo tệp colors.php kiểm tra các giá trị nằm trong phạm vi dự kiến, v.v.

+0

Cảm ơn! Làm việc như một say mê. Tôi hiểu sự cần thiết phải kiểm tra xem các biến có nằm trong phạm vi chính xác hay không nhưng vì tôi không hiển thị tập lệnh cho đầu vào của người dùng mà tôi có thể thực hiện mà không có điều đó. – Andrei

0

Hãy thử điều này:

RewriteEngine on 
RewriteRule /assets/colors/h([0-9]+)_s([0-9]+)_l([0-9]+)_a([0-9]+).png /assets/col.php?h=$1&s=$2&l=$3&a=$4 [QSA,L] 

tôi phải changeup tên kịch bản của tôi để làm cho công việc này. Bởi vì tôi có Options MultiViews,/assets/colors/luôn được xử lý bởi colors.php bất kể cấu hình mod_rewrite.

+0

Cảm ơn ! Tại sao bạn đề xuất sử dụng cờ [QSA]? – Andrei

+0

QSA là "chuỗi truy vấn chắp thêm", vì vậy nếu bạn quyết định xây dựng trong các tham số chuỗi truy vấn bổ sung như 'h100_s100_l100_a100.png? V = 1', phần' v = 1' sẽ được thêm vào phần còn lại của chuỗi truy vấn được tích hợp URL đích. Tôi thường thêm nó ra khỏi thói quen. –