2013-02-12 26 views
5

Tôi đang cố viết một phần còn lại trong php bằng cách sử dụng mod_rewrite.mod_rewrite: Cách chuyển hướng DELETE HTTP và PUT

Câu hỏi của tôi là: Làm cách nào để xử lý HTTP DELETE và PUT? Ví dụ: url sẽ là: /book/1234

trong đó 1234 là id duy nhất của sách. Tôi muốn "chuyển hướng" id này (1234) đến book.php với id là tham số. Tôi đã biết cách đọc các biến PUT và DELETE trong tập lệnh php, nhưng làm cách nào để thiết lập các quy tắc viết lại này trong mod_rewrite?

Bất kỳ ý tưởng nào?

Edit: Nguyên tắc viết lại cho một GET sẽ trông như thế này:

RewriteRule book/([0-9]+) book.php?id=$1 [QSA] 

Làm thế nào để làm điều này "tham số chuyển tiếp" cho PUT và DELETE? Theo như tôi biết HTTP POST, PUT và DELETE sử dụng HTTP Request Body để truyền các giá trị tham số. Vì vậy, tôi đoán tôi cần phải nối thêm các tham số trong cơ thể yêu cầu HTTP. Nhưng tôi không có ý tưởng làm thế nào để làm điều đó với mod_rewrite.

Tôi có thể thực hiện một số loại trộn DELETE và GET không?

RewriteCond %{REQUEST_METHOD} =DELETE 
RewriteRule book/([0-9]+) book.php?id=$1 [QSA] 

Sau đó, trong book.php tôi sẽ sử dụng $ _GET [ 'id'] để lấy id cuốn sách, ngay cả khi HEADER HTTP nói rằng phương thức HTTP là DELETE. Có vẻ như không hoạt động ...

+2

Bạn có thể sử dụng 'Tập lệnh PUT ...' hoặc RewriteCond trên '% {REQUEST_METHOD}' – mario

Trả lời

3

Tôi có thể làm một số loại trộn DELETE và GET?

Có. Bạn không cần phải lo lắng về phương thức yêu cầu hoặc cơ thể PUT trong tất cả các quy tắc viết lại của bạn.

Ví dụ bạn này có nghĩa là:

mod_rewrite

RewriteRule book/([0-9]+) book.php?id=$1 [QSA] 

yêu cầu HTTP

PUT /book/1234 
=> PUT /book.php?id=1234 

PHP script

$id = intval($_GET['id']); 
if ($_SERVER['REQUEST_METHOD'] === 'PUT') { 
    // yes, it is. go on as usual 
} 

Để làm rõ thêm: Sự khác biệt giữa các tham số GET và tham số PUT/POST/DELETE là trước đây là một phần của URL, phần sau của phần thân yêu cầu. mod_rewritechỉ thay đổi URL và không chạm vào cơ thể.

+0

Cảm ơn bạn rất nhiều! – sockeqwe

5

Có sẵn một chỉ thị RewriteCond. Bạn có thể sử dụng nó để chỉ định rằng (các) quy tắc sau chỉ hợp lệ trong một điều kiện nhất định. Sử dụng nó như thế này nếu bạn muốn viết lại bởi HTTP yêu cầu mthod:

RewriteCond %{REQUEST_METHOD} =PUT 
RewriteRule ^something\/([0-9]+)$ put.php?id=$1 

RewriteCond %{REQUEST_METHOD} =DELETE 
RewriteRule ^something\/([0-9]+)$ delete.php?id=$1 

# ... 
+0

vâng, nhưng làm cách nào để chuyển id (được truy xuất từ ​​url) dưới dạng tham số PUT sang tập lệnh php:/something/1234 Hơn tôi muốn rằng something.php có thể lấy id = "123" bằng cách nào đó.Đối với một GET HTTP tôi sẽ làm một cái gì đó như thế này: RewriteRule một cái gì đó/([0-9] +) something.php? Id = $ 1 [QSA]. Làm cách nào để chuyển tiếp tham số này cho PUT và DELETE? Theo như tôi biết tôi cần phải thêm một var trong cơ thể yêu cầu HTTP. Nhưng tôi không có ý tưởng làm thế nào để làm điều đó với mod_rewrite – sockeqwe

+0

Giống như trong bất kỳ quy tắc viết lại khác -> sử dụng regexes. Bạn có thể theo dõi rất nhiều hướng dẫn. Hoặc kiểm tra cập nhật của tôi – hek2mgl

+0

Cảm ơn bạn rất nhiều! – sockeqwe