mod_rewrite: How to redirect HTTP DELETE and PUT

2019-06-20 01:17发布

Im trying to write a little rest api in php by using mod_rewrite.

My question is: How do I handle HTTP DELETE and PUT? For example, the url would be: /book/1234

where 1234 is the unique id of a book. I want to "redirect" this id (1234) to book.php with the id as parameter. I already know how to read PUT and DELETE variables in the php script, but how do I set this rewrite rules in mod_rewrite?

Any ideas?

Edit: The rewriting rule for a GET would look like this:

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

How do I do this "parameter forwarding" for PUT and DELETE? As far as I know HTTP POST, PUT and DELETE use the HTTP Request Body for transmitting parameter values. So I guess I need to append the parameter in the HTTP request body. But I have no idea how to do that with mod_rewrite.

Can I do some kind of mixing DELETE and GET?

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

Then in book.php I would user $_GET['id'] to retrieve the book id, even if the HTTP HEADER says that the HTTP METHOD is DELETE. It does not seems to work ...

2条回答
做自己的国王
2楼-- · 2019-06-20 01:50

Can I do some kind of mixing DELETE and GET?

Yes. You don't need to worry about the request method or the PUT body at all in your rewrite rules.

For your example this means:

mod_rewrite

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

HTTP request

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
}

For further clarification: The difference between GET parameters and PUT/POST/DELETE parameters is that the former are part of the URL, the latter part of the request body. mod_rewrite only changes the URL and does not touch the body.

查看更多
祖国的老花朵
3楼-- · 2019-06-20 02:00

There is a RewriteCond directive available. You can use it to specify that the following rule(s) just valid under a certain condition. Use it like this if you want to rewrite by HTTP request 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

# ...
查看更多
登录 后发表回答