soc*_*qwe 6 php mod-rewrite http http-delete
我试图通过使用mod_rewrite在php中写一点休息api.
我的问题是:我如何处理HTTP DELETE和PUT?例如,网址为:/ book/1234
其中1234是一本书的唯一ID.我想将这个id(1234)"重定向"到book.php,id为参数.我已经知道如何在php脚本中读取PUT和DELETE变量,但是如何在mod_rewrite中设置这个重写规则?
有任何想法吗?
编辑:GET的重写规则如下所示:
RewriteRule book/([0-9]+) book.php?id=$1 [QSA]
Run Code Online (Sandbox Code Playgroud)
如何为PUT和DELETE执行"参数转发"?据我所知HTTP POST,PUT和DELETE使用HTTP Request Body来传输参数值.所以我想我需要在HTTP请求体中附加参数.但我不知道如何用mod_rewrite做到这一点.
我可以做一些混合DELETE和GET吗?
RewriteCond %{REQUEST_METHOD} =DELETE
RewriteRule book/([0-9]+) book.php?id=$1 [QSA]
Run Code Online (Sandbox Code Playgroud)
然后在book.php中,我会使用$ _GET ['id']来检索book id,即使HTTP HEADER说HTTP METHOD是DELETE.它似乎不起作用......
有一个RewriteCond指令可用.您可以使用它来指定以下规则在特定条件下有效.如果你想通过HTTP请求重写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
# ...
Run Code Online (Sandbox Code Playgroud)
我可以混合 DELETE 和 GET 吗?
是的。您根本不需要担心重写规则中的请求方法或 PUT 正文。
对于您的示例,这意味着:
模组重写
RewriteRule book/([0-9]+) book.php?id=$1 [QSA]
Run Code Online (Sandbox Code Playgroud)
HTTP请求
PUT /book/1234
=> PUT /book.php?id=1234
Run Code Online (Sandbox Code Playgroud)
PHP脚本
$id = intval($_GET['id']);
if ($_SERVER['REQUEST_METHOD'] === 'PUT') {
// yes, it is. go on as usual
}
Run Code Online (Sandbox Code Playgroud)
进一步说明:GET 参数和 PUT/POST/DELETE 参数之间的区别在于,前者是 URL 的一部分,后者是请求正文的一部分。mod_rewrite 只改变URL,不改变body。