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?

Apache mod_rewrite实现HTTP和HTTPS重定向跳转

.htaccess mod_rewrite 变量通过重定向

如何使用 apache mod_rewrite 规则重定向到动态 URL(不是经典重定向)?