如何在nginx上允许PUT DELETE进行表单提交

时间:2017-04-26 13:52:19

标签: php nginx

我有一个普通的PHP脚本监听$ _SERVER [“REQUEST_METHOD”] 我使用PUT方法提交表单,但是我收到错误405 在nginx服务器上。

只想使用请求方法提交一个简单的表单。

  1 server {                                                                        
  2                                                                                 
  3  listen   80; # port 80 default                                                 
  4                                                                                 
  5  root /home/user/workspace/l; # default directory where the files will be stored and served from
  6                                                                                 
  7  index index.php index.html index.htm; # index defined to be served under directory
  8                                                                                 
  9  server_name l; #name of the virtual host or domain                  
 10                                                                                 
 11 error_log /var/log/nginx/l.error.log;                                       
 12 access_log /var/log/nginx/l.access.log;                                     
 13                                                                                 
 14                                                                                 
 15  location / {                                                                   
 16    try_files $uri $uri/ /index.html;                                            
 17  }                                                                              
 18                                                                                 
 19 # Serve PHP scripts to FastCGI server our php-fpm server listening on 127.0.0.1:9000
 20                                                                                 
 21  location ~ \.php$ {                                                            
 22   fastcgi_pass 127.0.0.1:9000;                                                  
 23   # With php5-fpm:                                                              
 24   #fastcgi_pass unix:/var/run/php5-fpm.sock;                                    
 25   fastcgi_index index.php;                                                      
 26   fastcgi_split_path_info ^(.+\.php)(/.*)$;                                     
 27   include fastcgi_params;                                                       
 28   fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;            
 29   }                                                                             
 30 }   

请求调用是/index.php?groups

最初的电话是:

function updateGroup(group_name, group_id) {
    values = {};
    values.name = group_name;
    values.id = group_id;
    $.ajax({
        url: '?groups',
        type: 'PUT',
        data: values,
        success: success,
        dataType: 'json'
    });
}

3 个答案:

答案 0 :(得分:1)

nginx只允许GET用于静态文件。为了允许POST / PUT,必须配置nginx以将请求发送到PHP。因此,您在PUT上获得405的事实似乎表明您正在请求静态文件,这意味着您的nginx配置不会在您认为的情况下调用PHP。通过使用GET请求相同的URL,可以非常轻松地测试这一点 - 如果配置正确,您将获得PHP输出。如果配置不正确,您将获得PHP源代码。

答案 1 :(得分:0)

HTML规范不支持此功能,因此如果表单方法不是GET或POST,浏览器将发送GET请求。因此,一旦请求到达您的服务器,它已经太晚了。

此问题通常通过"方法欺骗"在框架中解决。像这样设置表单:

<form method="post" ...>
    <input type="hidden" name="_method" value="put" />
    ...
</form>

然后在PHP中使用此信息来评估如何路由请求。

也许可以在Nginx层上实现这一点,但我担心我无法就此提出建议。

答案 2 :(得分:0)

正如其他答案所指出的那样,nginx不允许GET或POST以外的方法使用静态资源。因此,您需要确保请求直接进入您的php处理。

如果您直接拨打index.php或任何特定的php文件,我遇到的大多数配置都可以正常工作。如果您希望/处理index.php的来电,但仍希望支持静态资源投放,则会出现此问题。

经过一段时间的努力,我发现你能够在nginx配置中嵌套location指令。这允许您控制文件扩展名正则表达式配置,而不会使事情变得太复杂。这就是我正在使用的。请注意,您的php cgi配置位于单独的文件中。

location ~ .+(?<!\.php)$ {
  location ~ ^[^.]*\.[^.]+$ {

  }
  location ~ / {
    include snippets/fastcgi-php.conf;
  }
}

location ~ \.php$ {
  include snippets/fastcgi-php.conf;
}