J'ai un script PHP normal à l'écoute de $ _SERVER ["REQUEST_METHOD"] et je soumets le formulaire en utilisant la méthode PUT, mais j'obtiens l'erreur 405 sur le serveur nginx.

Je veux simplement soumettre un formulaire simple en utilisant des méthodes de demande.

  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 }   

L'appel de demande est /index.php?groups

L'appel initial était:

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'
    });
}
0
Fernando André 26 avril 2017 à 16:52

3 réponses

Meilleure réponse

Nginx n'autorisera GET que pour les fichiers statiques. Afin d'autoriser POST / PUT, nginx doit être configuré pour envoyer la requête via PHP. Ainsi, le fait que vous obteniez un 405 sur un PUT semblerait indiquer que vous demandez un fichier statique, ce qui signifierait que votre configuration nginx n'invoque pas PHP là où vous le pensez. Cela peut être testé assez facilement en demandant la même URL avec GET - s'il est configuré correctement, vous obtiendrez une sortie PHP. s'il est mal configuré, vous obtiendrez le code source PHP.

2
Alex Howansky 26 avril 2017 à 14:11

Ce n'est pas pris en charge dans la spécification HTML, donc les navigateurs enverront à la place une requête GET si la méthode de formulaire n'est ni GET ni POST. Il est donc déjà trop tard une fois que la requête atteint votre serveur.

Ce problème est généralement résolu dans les frameworks via "l'usurpation de méthode". Configurez votre formulaire comme ceci:

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

Utilisez ensuite ces informations en PHP pour évaluer comment acheminer la requête.

Il pourrait également être possible d'accomplir déjà cela sur la couche Nginx, mais j'ai peur de ne pas pouvoir vous conseiller à ce sujet.

0
Erik Johansson 26 avril 2017 à 14:02

Comme le soulignent les autres réponses, nginx n'autorise pas les méthodes autres que GET ou POST aux ressources statiques. Vous devez donc vous assurer que la requête va directement à votre gestion php.

La plupart des configurations que j'ai rencontrées fonctionnent bien si vous passez un appel directement à index.php, ou à un fichier php spécifique. Le problème survient lorsque vous souhaitez que les appels à / soient traités par index.php, mais que vous souhaitez toujours prendre en charge la diffusion de ressources statiques.

Après avoir travaillé pendant un certain temps, j'ai découvert que vous pouviez imbriquer des directives location dans la configuration nginx. Cela vous permet de contrôler la configuration de votre extension de fichier regex sans compliquer les choses. Voici ce que j'utilise. Notez que votre configuration php cgi est dans un fichier séparé.

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

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

location ~ \.php$ {
  include snippets/fastcgi-php.conf;
}
0
OffTheBricks 31 déc. 2017 à 18:36