2016-10-22 1 views
1

J'implémente une API RESTful (plutôt complexe).lighttpd fastcgi: comment restaurer les éléments de chemin d'URL dépouillés?

J'utilise Lighttpd comme serveur web avec deux FastCGI backends:

  • un gestionnaire de PHP générique pour l'essentiel des demandes
  • un gestionnaire spécialisé C++ pour plusieurs autres demandes

ma Le fichier fastcgi.conf ressemble à (simplifié):

server.modules += ("mod_fastcgi") 

fastcgi.server = (".php" => ("PHP" => (
       "bin-path" => "/usr/bin/php-cgi", 
       "socket" => "/tmp/php.socket", 
       "check-local" => "disable", 
       "bin-environment" => ("PHP_FCGI_CHILDREN" => "0", "PHP_FCGI_MAX_REQUESTS" => "500"), 
       "bin-copy-environment" => ("PATH", "SHELL", "USER"), 
       "max-procs" => 1, 
       "broken-scriptfilename" => "enable" 
      )), 
       "/api/groupA" => ("Server" => (
       "socket" => "/tmp/fcgi-C.socket", 
       "check-local" => "disable", 
      )), 
       "/api/groupB" => ("Server" => (
       "socket" => "/tmp/fcgi-C.socket", 
       "check-local" => "disable", 
      )), 
       "/api/groupC" => ("Server" => (
       "socket" => "/tmp/fcgi-C.socket", 
       "check-local" => "disable", 
      )), 
       "/api/" => ("PHP" => (
       "bin-path" => "/usr/bin/php-cgi", 
       "socket" => "/tmp/php-P.socket", 
       "check-local" => "disable", 
       "bin-environment" => ("PHP_FCGI_CHILDREN" => "0", "PHP_FCGI_MAX_REQUESTS" => "500"), 
       "bin-copy-environment" => ("PATH", "SHELL", "USER"), 
       "max-procs" => 1, 
       "broken-scriptfilename" => "enable" 
      )) 
      ) 

Cela signifie que je filtre les préfixes destinés à la gestion C++ et le reste par défaut à PHP.

La partie PHP fonctionne comme prévu. Problème: le gestionnaire C++ reçoit un chemin de requête tronqué avec "/ group (A | B | C)" enlevé (tout le monde obtient le chemin sans "/ api", mais c'est OK).

Comment puis-je restaurer le chemin d'accès complet?

Alternativement: Y at-il (ou est-ce que je peux produire) une variable/en-tête/tout ce que je peux tester en C++ pour obtenir la "partie manquante"?

Je suis entièrement prêt à faire face à des informations redondantes (par exemple: le chemin est restauré à l'intégralité "/ api/..."), mais j'ai besoin de l'information qui a été abandonnée. La seule chose qui me vient à l'esprit serait de différencier les prises et de faire en sorte que le filtre restaure l'information en fonction de la prise d'entrée réelle mais qui semble trop complexe et très fragile; J'espère une solution plus simple, impliquant probablement URL-rewrite (je suis pas familier avec les complexités de configuration Lighttpd, je suis plus d'un codeur C++/PHP/java, donc j'espère que j'ai négligé quelque chose d'évident;))

Répondre