2013-02-12 98 views
5

我試圖通過使用mod_rewrite在php中寫一點休息api。我的問題是: 如何處理HTTP DELETE和PUT? 例如,url將是: /book/1234mod_rewrite:如何重定向HTTP DELETE和PUT

其中1234是書的唯一ID。我想將這個id(1234)「重定向到」book.php,並將id作爲參數。我已經知道如何在php腳本中讀取PUT和DELETE變量,但是如何在mod_rewrite中設置此重寫規則?

任何想法?

編輯: 一個GET重寫規則是這樣的:

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

我怎麼做這個「參數轉發」爲PUT和DELETE?據我所知,HTTP POST,PUT和DELETE使用HTTP請求體傳輸參數值。所以我想我需要在HTTP請求正文中追加參數。但我不知道如何用mod_rewrite來做到這一點。

我可以做一些混合DELETE和GET?

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

然後在book.php中我將用戶$ _GET [「身份證」]檢索書籍ID,即使HTTP頭說,HTTP方法是刪除。它似乎沒有工作...

+2

你可以在'%{REQUEST_METHOD}' – mario 2013-02-12 21:45:02

回答

3

我可以做一些混合刪除和獲取的:如果你想通過HTTP請求mthod重寫這樣使用它?

是的。在重寫規則中,您根本不必擔心請求方法或PUT正文。

對於你的榜樣,這意味着:

mod_rewrite的

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

HTTP請求

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

PHP腳本

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

進一步說明:GET參數和PUT/POST/DELETE參數之間的區別在於前者是URL的一部分,即請求主體的後半部分。 mod_rewrite只有更改網址並且不會觸及正文。

+0

非常感謝! – sockeqwe 2013-02-13 13:19:23

5

有一個RewriteCond指令可用。您可以使用它來指定以下規則在特定條件下才有效。

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

上使用'Script PUT ...'或RewriteCond,但是我怎麼把這個id作爲PUT參數傳遞給php腳本:/ something/1234比我想要的東西.php可以檢索ID =「123」莫名其妙。對於HTTP GET,我會這樣做:RewriteRule something /([0-9] +)something.php?id = $ 1 [QSA]。如何爲PUT和DELETE執行此參數轉發?據我所知,我需要在HTTP請求正文中附加一個var。但我不知道如何做到這一點與mod_rewrite – sockeqwe 2013-02-13 10:00:10

+0

像任何其他重寫規則 - >使用正則表達式。你可以按照大量的教程。或者查看我的更新 – hek2mgl 2013-02-13 11:59:10

+0

非常感謝! – sockeqwe 2013-02-13 13:18:57