Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

mod_rewrite: How to redirect HTTP DELETE and PUT

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 ...

like image 465
sockeqwe Avatar asked Feb 12 '13 21:02

sockeqwe


2 Answers

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

# ...
like image 95
hek2mgl Avatar answered Sep 22 '22 12:09

hek2mgl


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.

like image 25
Fabian Schmengler Avatar answered Sep 19 '22 12:09

Fabian Schmengler