mod_rewrite:如何重定向 HTTP DELETE 和 PUT
Posted
技术标签:
【中文标题】mod_rewrite:如何重定向 HTTP DELETE 和 PUT【英文标题】:mod_rewrite: How to redirect HTTP DELETE and PUT 【发布时间】:2013-01-28 08:09:11 【问题描述】:我正在尝试使用 mod_rewrite 在 php 中编写一个小的 rest 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]
如何为 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'] 来检索图书 ID,即使 HTTP HEADER 说 HTTP METHOD 是 DELETE。它似乎不起作用...
【问题讨论】:
你可以在%REQUEST_METHOD
上使用Script PUT ...
或RewriteCond
【参考方案1】:
有一个RewriteCond
指令可用。您可以使用它来指定以下规则仅在特定条件下有效。如果你想通过 HTTP 请求方式重写,可以这样使用:
RewriteCond %REQUEST_METHOD =PUT
RewriteRule ^something\/([0-9]+)$ put.php?id=$1
RewriteCond %REQUEST_METHOD =DELETE
RewriteRule ^something\/([0-9]+)$ delete.php?id=$1
# ...
【讨论】:
是的,但是我如何将 id(从 url 检索)作为 PUT 参数传递给 php 脚本:/something/1234 比我想要的东西.php 可以检索 id = "123"不知何故。对于 HTTP GET,我会这样做: RewriteRule something/([0-9]+) something.php?id=$1 [QSA] 。如何为 PUT 和 DELETE 进行此参数转发?据我所知,我需要在 HTTP 请求正文中附加一个 var。但我不知道如何使用 mod_rewrite 来做到这一点 就像在任何其他重写规则中一样 -> 使用正则表达式。您可以按照大量教程进行操作。或者查看我的更新【参考方案2】:我可以混合使用 DELETE 和 GET 吗?
是的。在重写规则中,您根本不需要担心请求方法或 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
只改变网址,不触及正文。
【讨论】:
以上是关于mod_rewrite:如何重定向 HTTP DELETE 和 PUT的主要内容,如果未能解决你的问题,请参考以下文章
如何使用基于 404 错误的 mod_rewrite 重定向到自定义错误页面
使用 Mod_rewrite 将 HTTP 重定向到 HTTPS
如何在没有 mod_rewrite 的情况下重定向除一个路径及其所有子路径之外的所有 URL?