mod_rewrite: How to redirect HTTP DELETE and PUT

怎甘沉沦 提交于 2019-12-10 13:29:13

问题


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


回答1:


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.




回答2:


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

# ...


来源:https://stackoverflow.com/questions/14842381/mod-rewrite-how-to-redirect-http-delete-and-put

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!