通过DELETE表单方法删除服务器上的文件


Deleting a file on server by DELETE form method

我正试图使用html表单中的delete方法删除服务器上的文件。

我有一个文件,该文件的url是:

 http://example.com/file2.php

我正在使用以下代码删除文件:

<form action="file2.php"method="DELETE">
<input type="submit"value="delete file">
</form>

当我按下"删除文件"按钮时,我会被重定向到"file2.php",但它并没有删除文件。

服务器正在接收GET方法中的请求标头:

GET /file2.php HTTP/1.1

而不是DELETE:

DELETE /file2.php HTTP/1.1

有人知道为什么删除方法不起作用吗?或者如何使用delete方法删除我的文件?

大多数浏览器不支持DELETE作为<form ...>的方法参数。事实上,它甚至不是HTML规范的一部分:

方法formmethod内容属性是具有以下关键字和状态的枚举属性:

  • 关键字get,映射到状态get,指示HTTP get方法。

  • 关键字post,映射到状态post,指示HTTP post方法。

这里有一些解释:

我们目前似乎还不了解PUT和DELETE对HTML表单的用处。

对于DELETE,创建一个有用的请求确实很容易。然而,服务器实现通常以200和最小响应主体("已删除")或204(无内容)进行响应。因此,目前还不清楚如何在web应用程序中使用它。

对于PUT,似乎没有真正的用例,只要网页不能完全控制有效负载,也可以设置内容类型。

请考虑删除此功能,直到更清楚地了解它的好处。

像laravel这样的框架提供方法欺骗:

<input type='_method' value='DELETE' />

这将覆盖请求的方法,并将(例如)调用destroy函数:

Route::delete('/items/{id}', 'ItemController@destroy');

如果你不使用框架,你可以尝试模仿这种行为:

if($_SERVER['REQUEST_METHOD'] === 'DELETE' || (isset($_REQUEST['_method'] && $_REQUEST['_method'] === 'delete') {
...
}

Mozilla仅指定GETPOST

我有两个建议:

  • 使用POST将数据发送到PHP代码,并从那里进行处理

  • 不要真的删除那么简单的东西。创建一些函数,只会说它被删除,直到你真的确定它必须离开