在nginx中使用方法DELETE启用请求的正确方法

时间:2015-05-10 18:09:36

标签: rest nginx

我在PHP中编写RESTful应用程序并启用了对nginx的DELETE,PUT请求。

    location / {
        root   html;
        index  index.php index.html index.htm;
        dav_methods PUT DELETE;
    }

当我用方法DELETE执行REST请求时,我想在index.php中处理 - nginx删除了html文件夹。

告诉nginx将DELETE请求传递给index.php的正确方法是什么?

2 个答案:

答案 0 :(得分:2)

NginX直接执行那些HTTP方法(DELETE,PUT),甚至没有调用PHP引擎,因为它们是由nginX中的DAV扩展处理的。 要解决此问题,您可以对所有API调用使用POST HTTP方法,但添加其他自定义标头以指示实际的REST方法 - 而不是此

PUT /api/Person/4 HTTP/1.1
Host: localhost:10320
Content-Type: application/json
Cache-Control: no-cache

您将调用此

POST /api/Person/4 HTTP/1.1
Host: localhost:10320
Content-Type: application/json
X-REST-Method: PUT
Cache-Control: no-cache

然后在PHP中你将以这种方式检查

if($_SERVER['HTTP_X_REST_METHOD']!='')
switch($_SERVER['HTTP_X_REST_METHOD'])
{
  case 'PUT':
    ...
    break;
  case 'PATCH':
    ...
    break;
  case 'DELETE':
    ...
    break;
}

答案 1 :(得分:1)

Nginx不会禁用PUT或DELETE请求,但它不允许对文件夹索引发出这些请求。实际上并不需要使用nginx启用任何东西(您应该删除dav_methods行),但是您需要避免通过索引指令访问index.php,如:

index  index.php index.html index.htm;

而是使用try_files来匹配index.php文件,例如:

try_files $uri /index.php$is_args$args;

在这种情况下,nginx不会抱怨您的DELETE方法。