Sign in Join
Wiki copytemporary

fcl-web/fr: what changed

Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11## Contents
22
33 * 1 Qu'est ce que fpWeb ?
44 * 2 Utilisation de fpWeb avec Lazarus
55 * 2.1 Installation du paquet Lazarus fpWeb weblaz
66 * 2.2 Création d'une application CGI
77 * 2.3 Déploiement d'une application CGI
88 * 2.4 Formatage du HTML and lecture des champs de requête
99 * 2.5 Lecture des données GET
1010 * 2.6 Lecture des données POST
1111 * 2.7 Lecture des données binaire POST
1212 * 3 Modules spécialisés
1313 * 4 Utiliser de multiples modules
1414 * 5 Utilisation des actions
1515 * 6 Utilisation des patrons HTML
1616 * 7 Conseils & résolution de problèmes
1717 * 7.1 Envoi des codes de retour
1818 * 7.2 Envoi de données binaires
1919 * 7.3 Erreur: "Could not determine HTTP module for request"
2020 * 7.4 Erreur: "response code 500 Internal Server error when trying to handle DELETE method"
2121 * 7.5 fpWeb/FCGI et Apache 2.4 (mode mod_proxy_fcgi)
2222 * 7.6 fpWeb/FCGI et nginx
2323 * 8 Notes
2424 * 9 Voir aussi
2525
2626## Qu'est ce que fpWeb ?
2727
2828fpWeb peut être utilisé pour construire des applications Web serveur. Une application serveur Web peut être l'une des suivantes:
2929
3030 * Application CGI.
3131 * Application FastCGI.
3232 * Module Apache.
3333 * Serveur HTTP(s) autonome utilisant les composants Free Pascal HTTP server.
3434 * Serveur HTTP(s) autonome utilisant libmicrohttp de GNU.
3535 * Application Windows SysHTTP.
3636
3737Dans tous les cas, le modèle de développement est le même : Vous enregistrez des gestionnaires (handlers) pour un ensemble d'URL (appelées routes) auxquels votre application saura répondre. Ensuite vous incorporez ces routes dans l'un des environnements du dessus : Ceci signifie que vous choisissez l'objet application que vous allez utilisez.
3838
3939Dans l'EDI Lazarus, vous avez le choix des applications quand vous commencez un nouveau projet. Il est possible de changer le type d'application une fois que l'application a été démarrée, cela se limite souvent au changement de nom d'une unité dans la clause `uses` du projet.
4040
4141Il est possible de prendre en charge de multiples environnement dans un unique exécutable, au prix de quelques efforts supplémentaires. fpWeb offre aussi du support non conventionnel pour un serveur de base de données REST ou pour des mécanismes JSON RPC 2.0. Ceux-ci sont construits en haut de la structure du dessus. Le [[Brook for Free Pascal/fr|cadre d'application Brook]] est aussi construit en haut de l'architecture exposée au dessus. Plus d'informations sur le sujet peut être trouvé dans [[fpWeb Tutorial]].
4242
4343## Utilisation de fpWeb avec Lazarus
4444
4545### Installation du paquet Lazarus fpWeb weblaz
4646
4747The first step to do is installing the package which comes in the path lazarus/components/fpweb/weblaz.lpk. As usual with design-time packages, you'll have to rebuild Lazarus.
4848
4949### Création d'une application CGI
5050
5151Après que le paquet `weblaz` ait été installé, une très simple application Web CGI qui affiche une page HTML peut être créée en allant dans le menu Lazarus "Fichier" -> "Nouveau...". Dans la liste des applications possibles, sélectionnez "CGI Application" comme dans l'image ci-dessous, qui va créer un fichier de projet CGI principal et un Web module fpweb.
5252
5353[![New cgi.PNG](/wiki-images/e/ec/New_cgi.PNG)](</File:New_cgi.PNG>)
5454
5555Le TFPWebModule vous permet de manipuler des propriétés et des événements utilisant l'inspecteur d'objet.
5656
5757Pour ajouter du code pour montrer la page, un gestionnaire de requête doit être ajouté. Pour faire ceci, double-cliquer sur la propriété `OnRequest` dans l'inspecteur d'objet, comme dans l'image qui suit:
5858
5959[![Webmodule.PNG](/wiki-images/3/3d/Webmodule.PNG)](</File:Webmodule.PNG>)
6060
6161Dans le gestionnaire d'événement, on doit écrire le code HTML qui sera affiché par le navigateur. Pour éviter de mélanger le Pascal et le HTML, cette page peut être chargée depuis le répertoire où se trouve l'exécutable CGI, en utilisant `AResponse.Contents.LoadFromFile()`.
6262
6363Le type de la réponse doit être défini dans `AResponse.ContentType`. Pour les pages HTML, cela devrait avoir la valeur `'text/html;charset=utf-8'`.
6464
6565Finalement, `Handled` devrait être défini à `True` pour indiquer que la requête a été traité avec succès (et retourne un code d'état '200 OK' au navigateur). Après l'ajout de ce code, le module Web devrait ressembler à ceci :
6666```
6767unit mainpage;
6868
6969 {$mode objfpc}{$H+}
7070
7171 interface
7272
7373 uses
7474 Classes, SysUtils, FileUtil, HTTPDefs, websession, fpHTTP, fpWeb;
7575
7676 type
7777
7878 { TFPWebModule1 }
7979
8080 TFPWebModule1 = class(TFPWebModule)
8181 procedure DataModuleRequest(Sender: TObject; ARequest: TRequest;
8282 AResponse: TResponse; var Handled: Boolean);
8383 private
8484 { private declarations }
8585 public
8686 { public declarations }
8787 end;
8888
8989 var
9090 FPWebModule1: TFPWebModule1;
9191
9292 implementation
9393
9494 {$R *.lfm}
9595
9696 { TFPWebModule1 }
9797
9898 procedure TFPWebModule1.DataModuleRequest(Sender: TObject; ARequest: TRequest;
9999 AResponse: TResponse; var Handled: Boolean);
100100 begin
101101 AResponse.ContentType := 'text/html;charset=utf-8';
102102 AResponse.Contents.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'mainpage.html');
103103 Handled := True;
104104 end;
105105
106106 begin
107107 RegisterHTTPModule('TFPWebModule1', TFPWebModule1);
108108 end.
109109```
110110
111111### Déploiement d'une application CGI
112112
113113Cette section suppose que le serveur Web Apache est utilisé. Bien sûr, d'autres serveurs Web qui supportent CGI (nginx, cherokee) peuvent aussi être utilisé.
114114
115115Apache peut être téléchargé [ici](<http://httpd.apache.org/download.cgi>) ou installé en utilisant le gestionnaire de paquets de votre distribution.
116116
117117L'installation par défaut d'Apache traitera tous les fichiers dans son répertoire cgi-bin comme des programmes CGI, afin que l'utilisateur ne puisse pas accéder aux fichiers HTML simples qui y sont placés. Ce répertoire peut être défini dans le fichier `httpd.conf` dans la section suivante :
118118```
119119#
120120 # ScriptAlias: This controls which directories contain server scripts.
121121 # ScriptAliases are essentially the same as Aliases, except that
122122 # documents in the target directory are treated as applications and
123123 # run by the server when requested rather than as documents sent to the
124124 # client. The same rules about trailing "/" apply to ScriptAlias
125125 # directives as to Alias.
126126 #
127127 ScriptAlias /cgi-bin/ "C:/Program Files/Apache Software Foundation/Apache2.2/cgi-bin/"
128128```
129129
130130Si vous placez un exécutable appelé "mywebpage.cgi" dans ce répertoire, alors la page peut être accédée comme `<http://localhost/cgi-bin/mywebpage.cgi>` (ou à distance avec l'adresse IP correspondante ou le nom de domaine).
131131
132132fcl-web avec Lazarus sur Windows produit des fichiers .exe. Pour qu'Apache serve ces fichiers, vous devez ajouter ceci:
133133```
134134AddHandler cgi-script .exe
135135```
136136
137137Et pour servir vos exécutables depuis un autre répertoire, vous ajoutez ceci :
138138```
139139ScriptAlias /bin/ "C:/lazarus_projects/test-fclweb/bin/"
140140 <Directory "C:/lazarus_projects/test-fclweb/bin/">
141141 AllowOverride None
142142 Options None
143143 Order allow,deny
144144 Allow from all
145145 </Directory>
146146```
147147
148148### Formatage du HTML and lecture des champs de requête
149149
150150L'exemple précédent montrait juste une simple page HTML. On pourrait désirer p.ex. :
151151
152152 * changer dynamiquement la sortie de la page HTML, et
153153 * en lisant les variables que le navigateur a transmises à la page Web dans les champs de requête (par exemple dans les actions HTTP GET et HTTP POST).
154154
155155Une solution simple pour le premier problème est l'utilisation de routine de format du Pascal standard et l'ajout des `%s` ou `%d` dans le fichier HTML aux places appropriées qui recevront les valeurs spécifiques.
156156
157157### Lecture des données GET
158158
159159Pour lire les variables GET, on peut utiliser `ARequest.QueryFields`, qui est un descendant de TStrings. Chaque variable sera dans une ligne séparée de la TStrings selon le format NomVariable=Valeur, de la même façon qu'elles sont montrées dans l'adresse de la page du navigateur. Pour accéder à une variable, on utilise `ARequest.QueryFields.Values[]` en passant le nom de la variable dans les crochets pour recevoir en retour sa valeur, au lieu d'analyser la chaîne manuellement (NdT: Explication superflue, classe de base du Pascal Objet).
160160
161161Le code résultant :
162162```
163163procedure TFPWebModule1.DataModuleRequest(Sender: TObject; ARequest: TRequest;
164164 AResponse: TResponse; var Handled: Boolean);
165165 var
166166 HexText, AsciiText: string;
167167 begin
168168 HexText := ARequest.QueryFields.Values['hex'];
169169 AsciiText := HexToAnsii(HexText);
170170
171171 AResponse.ContentType := 'text/html;charset=utf-8';
172172 AResponse.Contents.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'mainpage.html');
173173 AResponse.Contents.Text := Format(AResponse.Contents.Text,
174174 [HexText, AsciiText]);
175175 Handled := True;
176176 end;
177177```
178178
179179### Lecture des données POST
180180
181181Les données soumises par des requêtes POST peuvent être obtenues de `TRequest.Content`. Il viendra sans les entêtes de requête - en d'autres mots, il contient le corps de la requête.
182182
183183Les données de formulaire soumises peuvent être accédées en utilisant `TRequest.ContentFields` qui est le contenu analysé comme des champs séparés par & et décodés. Par exemple, l'ensemble suivant de valeurs de formulaire :
184184```
185185login: dfg 345&&
186186 login_senha: ====
187187 email: dfg
188188```
189189
190190Sera décodé en 'APPLICATION/X-WWW-FORM-URLENCODED' comme ceci (voir [wikipedia POST (HTTP)](<http://en.wikipedia.org/wiki/POST_%28HTTP%29>)):
191191```
192192login=dfg+345%26%26&login_senha=%3D%3D%3D%3D&email=dfg
193193```
194194
195195Et sera disponible dans `TRequest.ContentFields` via l'index de ligne ou en utilisant la propriété `Values`, ce qui est plus pertinent :
196196```
197197TRequest.ContentFields[0]: login=dfg 345&&
198198 TRequest.ContentFields[1]: login_senha=====
199199 TRequest.ContentFields[2]: email=dfg
200200 TRequest.ContentFields.Values['email']: dfg
201201```
202202
203203En cas d'utilisation d'autres types MIME que 'MULTIPART/FORM-DATA' et 'APPLICATION/X-WWW-FORM-URLENCODED' (les types supportés par les formulaires HTML) :
204204
205205 * le contenu est uniquement disponible dans `TRequest.Content` et non pas `TRequest.ContentFields`.
206206 * l'usage de ces types MIME lève un exception pour FPC 2.4.2 (corrigé dans FPC 2.5+).
207207
208208Remarquez que HTTP POST peut aussi envoyer des champs de requête (dans l'URL), p.ex. `<http://server/bla?question=how>`, et qui sont accédés par `TRequest.QueryFields` comme expliqué dans la section précédente.
209209```
210210procedure TFPWebModule1.DataModuleRequest(Sender: TObject; ARequest: TRequest;
211211 AResponse: TResponse; var Handled: Boolean);
212212 var
213213 lData: String;
214214 begin
215215 lData := ARequest.Content;
216216```
217217
218218### Lecture des données binaire POST
219219
220220Les fichiers téléchargés vers le serveur sont sauvés dans un emplacement temporaire avec un nom de fichier temporaire, pour conserver le fichier, vous devrez le déplacer vers un emplacement permanent.
221221
222222Pour recevoir des données sur le serveur qui a été POSTé p.ex comme multipart/form-data, utilisez quelques chose comme ceci :
223223```
224224procedure TMainWebModule.TFPWebActions2Request(Sender: TObject;
225225 ARequest: TRequest; AResponse: TResponse; var Handled: Boolean);
226226 var
227227 i: Integer;
228228 begin
229229 // Process all received files
230230 for i := 0 to ARequest.Files.Count - 1 do
231231 begin
232232 // Doing something else than writeln is highly recommended ;)
233233 writeln ('Received Filename: '+ARequest.Files[i].LocalFileName);
234234 end;
235235
236236 Handled := true;
237237 end;
238238```
239239
240240Le client peut envoyer des données en utilisant p.ex. `FileFormPost`.
241241
242242## Modules spécialisés
243243
244244La classe *`TFPWebModule`* (utilisée dessous) est un simple exemple de module Web quii peut être utilisé pour toutes sortes de requêtes HTTP..
245245
246246Toutefois, fpweb vient avec quelques modules spécialisés, qui réalisent des tâches spécialisés :
247247
248248 * La classe **TSimpleFileModule** dans l'unité _fpwebfile.pp_ peut etre utilisée pour envoyer des fichiers. Vous pointez vers un répertoire et elle fait le reste.
249249 * La classe **TFPHTMLModule** dans l'unité _fphtml.pp_ peut être utlisé pour produire du HTML.
250250 * La classe **TProxyWebModule** dans l'unité _fpwebproxy.pp_ est un proxy de transmission (forwarding proxy) prêt à l'emploi.
251251 * La classe **TFPWebProviderDataModule** dans l'unité _fpwebdata.pp_ sert des données au format JSON qui peut être consommé par des magasins (stores) ExtJS.
252252 * La classe **TSQLDBRestModule** dans l'unité _sqldbrestmodule.pp_ implémente un serveur full REST appuyé par SQLDB. Voir plus d'informations dans [[SQLDBRestBridge]].
253253 * La classe **TJSONRPCModule** dans l'unité _webjsonrpc.pp_ implémente un service JSON-RPC.
254254 * La classe **TExtDirectModule** dans l'unité _fpextdirect.pp_ implémente une variante Ext.Direct d'un service JSON-RPC.
255255
256256## Utiliser de multiples modules
257257
258258Si il y a un seul module dans l'application Web, toutes les requêtes seront redirigées vers ce module.
259259
260260Comme votre application Web grossit, de multiples modules peuvent être utilisés. Un nouveau module peut être ajouté en choisissant "Fichier" -> "Nouveau..." et ensuite un des 'Module Web' ou 'Module Web HTML'.
261261
262262FCL-web utilise l'URL pour déterminer comment une requête HTTP qui devrait être manipulé. Il doit donc savoir quels modules Web existent dans l'application. Pour ce faire, chaque module doit être enregistré.
263263
264264Chaque module est enregistré avec fcl-web dans la section 'initialisation de l'unité dans lequel il est défini:
265265```
266266RegisterHTTPModule('location', TMyModule);
267267```
268268
269269Le module sera alors invoqué si une URL de la forme
270270```
271271http://www.mysite.org/mycgi.cgi/location
272272```
273273
274274ou
275275```
276276http://www.mysite.org/mycgi.cgi?module=location
277277```
278278
279279est utilisée.
280280
281281Si plusieurs modules sont présents, le nom du module doit apparaître dans l'URL, ou une erreur sera levée.
282282
283283Ce comportement peut aussi être forcé pour les applications qui ont seulement un unique module en définissant la propriéte `AllowDefaultModule` de l'application à `False` :
284284```
285285Application.AllowDefaultModule := False;
286286```
287287
288288Dans ce cas, l'application fcl-web requerra toujours le nom du module dans l'URL.
289289
290290Le nom de la variable de requête qui détermine le nom du module (par défaut, c'est 'module') peut être défini dans la propriété `Application.ModuleVariable`. Le code suivant
291291```
292292Application.ModuleVariable := 'm';
293293```
294294
295295assure que l'URL suivante est dirigée vers `TMyModule` :
296296```
297297http://www.mysite.org/mycgi.cgi?m=location
298298```
299299
300300Si tout ceci n'est pas suffisant pour déterminer le module vers lequel la requête devrait être passée, l'événement `Application.OnGetModule` peut être utilisé. Il est du type `TGetModuleEvent` :
301301```
302302type
303303 TGetModuleEvent = Procedure (Sender : TObject; ARequest : TRequest;
304304 Var ModuleClass : TCustomHTTPModuleClass) of object;
305305```
306306
307307La création d'un gestionnaire pour cet événement permet un contrôle fin sur le module qui est créé pour manipuler la requête : la requête (passée dans `ARequest`) peut être examinée et la variable `ModuleClass` doit être définie par la classe du module qui devrait manipuler la requête.
308308
309309Si `ModuleClass` vaut `Nil` au retour, une erreur sera envoyée au navigateur.
310310
311311## Utilisation des actions
312312
313313Un module peut être utilisé pour grouper certaines sortes d'actions logiquement liées. Imaginez un module `TUserModule` qui est utilisé pour traiter la gestion utilisateur dans les pages Web. Il peut y avoir de multiples actions associées avec un utilisateur :
314314
315315 * Création
316316 * Suppression
317317 * Mise à jour
318318 * Affichage
319319
320320Ces différentes actions peuvent être maniée par le mêm module. On peut déterminer l'action depuis l'URL manuellement, comme dans :
321321```
322322http://mysite/mycgi.cgi/user?action=delete&id=12
323323```
324324
325325Cela peut être automatisé.
326326
327327Afin de rendre plus facile la distinction entre les diverses actions, le module a une propriété `actions` : c'est une collection, dans laquelle chaque article est associé avec une réponse différente à la requête. Les actions ont diverses propriétés :
328328
329329`Name`
330330 Le nom de l'action. L'URL sera examinée pour déterminer le nom de l'action.
331331`Content`
332332 Une chaîne de caractères. Si définie, c'est envoyé vers le navigateur.
333333`Contents`
334334 Une TStringList. c'est envoyé vers le navigateur.
335335`ContentProducer`
336336 Si définie, the ContentProducer maniera la requête.
337337`Default`
338338 Si définie à `True`, alors cette action est l'action par défaut. Ceci signifie que si FCL-Web ne peut pas déterminer le nom de l'action, cette action sera exécutée.
339339`Template`
340340 Si définie, ce patron sera traité et les résultats envoyés vers le navigateur.
341341
342342Il y a aussi quelques événements :
343343
344344`BeforeRequest`
345345 exécuté avant que la requête ne soit traitée. Peut être utilisé pour définir le 'Content' ou d'autres propriétés.
346346`AfterRequest`
347347 exécuté après le traitement de la requête.
348348`OnRequest`
349349 un gestionnaire d'événement pour manier la requête. Si défini, le gstionnaire est utilisé pour manier la requête.
350350
351351Encore une fois, comme dans le cas de plusieurs modules, l'URL est utilisée pour déterminer quelle action exécuter. La partie juste après la partie module ("utilisateur" dans cet exemple) est utilisée:
352352```
353353http://mysite/mycgi.cgi/user/delete&id=12
354354```
355355
356356exécutera l'action nommée 'delete'.
357357
358358La propriété `ActionVar` du module peut être utilisée pour définir le nom de la variable de requête à utiliser. En affectant :
359359```
360360UserModule.ActionVar := 'a';
361361```
362362
363363peut être utilisé pour changer l'URL du dessus en :
364364```
365365http://mysite/mycgi.cgi/user?a=delete&id=12
366366```
367367
368368S'il y a seulement un module dans l'application, l'URL peut être raccourci en :
369369```
370370http://mysite/mycgi.cgi/delete&id=12
371371```
372372
373373## Utilisation des patrons HTML
374374
375375Pour de l'information au sujet des patrons (template), des étiquettes de patron (template tags) et des paramètres d'étiquettes de patron (template tag parameters) pour générer les pages de réponse, veuillez vous référer au fichier `fptemplate.txt` dans le répertoire FPC dans `/packages/fcl-base/texts/` (NdT : spécifique Linux)
376376
377377Des projets d'exemple qui démontrent l'utilisation des patrons peuvent être trouvés sous le répertoire FPC dans `/packages/fcl-web/examples/fptemplate` (voir le README.txt dedans pour plus).
378378
379379(Dans les versions antérieures, ces exemples se trouvaient dans le répertoire Lazarus dans `/components/fpweb/demo/fptemplate/`)
380380
381381## Conseils & résolution de problèmes
382382
383383### Envoi des codes de retour
384384
385385Pour envoyer une réponse HTTP différente de 200 OK, utiliser `AResponse.Code` et `AResponse.CodeText`, p.ex. :
386386```
387387AResponse.Code := 404;
388388 AResponse.CodeText := 'Document not found';
389389```
390390
391391### Envoi de données binaires
392392
393393Une approche qui semble marcher pour envoyer p.ex. un fichier tiff depuis le serveur Web vers le client - adapté de `$(fpcdirectory)\packages\fcl-web\examples\jsonrpc\demo1\wmdemo.pp` \- quelque chose comme ceci :
394394```
395395AResponse.ContentStream := TMemoryStream.Create;
396396
397397 try
398398 AResponse.ContentStream.LoadFromFile('/tmp/sample.tiff');
399399 AResponse.ContentType := 'image/tiff'; //or whatever MIME type you want to send
400400 // to do: there is an fpweb example that gets the mime type from the file extension...
401401 AResponse.ContentLength:=AResponse.ContentStream.Size; //apparently doesn't happen automatically?
402402 AResponse.SendContent;
403403 finally
404404 AResponse.ContentStream.Free;
405405 end;
406406
407407 Handled := true;
408408```
409409
410410### Erreur: "Could not determine HTTP module for request"
411411
412412Vous pouvez avoir de multiples modules et de multiples actions. Si vous spécifiez une URL avec un seul item, comme :
413413```
414414http://localhost/cgi-bin/somemodule
415415```
416416
417417alors fpweb suppose que vous êtes en train de spécifier une action. Si vous n'avez pas défini un module par défaut, vous obtiendrez une "500 internal server error (Could not determine HTTP module for request)".
418418
419419Vous pouvez modifier ce comportement pour permettre à fpweb de correspondre à un nom de module à la place en définissant la propriété `PreferModuleName` de l'application sur `True`.
420420
421421### Erreur: "response code 500 Internal Server error when trying to handle DELETE method"
422422
423423Dans FPC 2.6.2 et antérieur, fcl-web n'accepte pas la méthode DELETE et génère une erreur.
424424
425425### fpWeb/FCGI et Apache 2.4 (mode mod_proxy_fcgi)
426426
427427Quand vous voulez déployer une application FastCGI derrière un proxy inverse Apache 2.4+, vous avez besoin de la variable PATH_INFO dans les entêtes qui sont envoyés vai une socket au démon FastCGI.
428428
4294291, Activer les modules suivants: setenvif_module, proxy_module et proxy_fcgi_module
430430
431431(sur CentOS 7 modules sont définis dans le fichier `/etc/httpd/conf.modules.d/00-base.conf` et `/etc/httpd/conf.modules.d/00-proxy.conf)`.
432432```
433433LoadModule setenvif_module modules/mod_setenvif.so
434434 LoadModule proxy_module modules/mod_proxy.so
435435 LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
436436```
437437
4384382, Configuration du proxy inverse pour fpWeb/FCGI écoutant sur le port 9000.
439439$1 = module name
440440$2 = action name
441441```
442442SetEnvIf Request_URI . proxy-fcgi-pathinfo=full
443443 ProxyPassMatch "/fcgi/(.*)/(.*)" "fcgi://127.0.0.1:9000/$1/$2"
444444```
445445
446446### fpWeb/FCGI et nginx
447447
448448Pour un routage correct, fcl-web requiert que la variable PATH_INFO dans les entêtes envoyés depuis nginx. Pour cela, vous devez diviser l'URL entière en nom d'application FastCGI et en partie information de chemin (path info) avec l'instruction de configuration _fastcgi_split_path_info_. L'instruction accepte une expression régulière et pose la seconde correspondance dans la variable de configuration _$fastcgi_path_info_. Cette variable peut être passée à votre application avec l'instruction _fastcgi_param_.
449449
450450L'exemple de configuration suivante inclut un hôte virtuel complet pour nginx qui passe tout depuis _<http://myserver:8080/mycgiapp/>_ vers une application FastCGI externe.
451451```
452452server {
453453
454454 listen 8080;
455455 listen [::]:8080;
456456
457457 server_name _;
458458
459459 root "/var/www";
460460
461461 location /mycgiap/ {
462462 # setting up PATH_INFO
463463 fastcgi_split_path_info ^(/mycgiapp/)(.*)$;
464464 fastcgi_param PATH_INFO $fastcgi_path_info;
465465
466466 # other parameters
467467 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
468468 fastcgi_param QUERY_STRING $query_string;
469469 fastcgi_param REQUEST_METHOD $request_method;
470470 fastcgi_param CONTENT_TYPE $content_type;
471471 fastcgi_param CONTENT_LENGTH $content_length;
472472 fastcgi_param SCRIPT_NAME $fastcgi_script_name;
473473 fastcgi_param REQUEST_URI $request_uri;
474474 fastcgi_param DOCUMENT_URI $document_uri;
475475 fastcgi_param DOCUMENT_ROOT $document_root;
476476 fastcgi_param SERVER_PROTOCOL $server_protocol;
477477 fastcgi_param REQUEST_SCHEME $scheme;
478478 fastcgi_param HTTPS $https if_not_empty;
479479 fastcgi_param GATEWAY_INTERFACE CGI/1.1;
480480 fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
481481 fastcgi_param REMOTE_ADDR $remote_addr;
482482 fastcgi_param REMOTE_PORT $remote_port;
483483 fastcgi_param SERVER_ADDR $server_addr;
484484 fastcgi_param SERVER_PORT $server_port;
485485 fastcgi_param SERVER_NAME $server_name;
486486
487487 # pass requests to your FastCGI application
488488 fastcgi_pass 127.0.0.1:9000;
489489 }
490490 }
491491```
492492
493493## Notes
494494
495495 * L'unité cgiapp est dépréciée, veuillez utiliser fpcgi autant que possible.
496496 * Les unités fastcgi, custfcgi et fpfcgi ne sont pas supportées sur Darwin en ce moment (Ndt: Qu'en est-il en 2020 ?), parce qu'il utilise un mécanisme qui différe de l'option MSG_NOSIGNAL pour recv() pour indiquer qu'aucun SIGPIPE ne doit être levé en cas de rupture de la connexion. Voir <http://lists.apple.com/archives/macnetworkprog/2002/Dec/msg00091.html> pour comment cela peut être fixé.
497497 * Si vous déployez votre application et obtenez des erreurs comme "Error: No action name and no default action", vous devrez vous assurer qu'il y a une action affectée à l'URL, ou intercepter les actions non supportées avec une action marquée Default. Dans les deux cas, un gestionnaire d'événement `OnRequest` pour l'action qui définit `Handled:=true` devrait être utilisé.
498498
499499## Voir aussi
500500
501501 * [[fpWeb Tutorial]]
502502 * [[fphttpclient]] Partie de fcl-web qui peut être utilisé de manière autonome dans des applications clientes.
503503 * _write me!_ fphttpserver Petit serveur Web autonome en Pascal Objet. Peut être utilisé pour servir des applications CGI fcl-web.
504504 * [[CGI Web Programming/fr|Débogage de CGI]] Information concernant le débogage des applications CGI.
505505 * [Part of a tutorial by Leonardo Ramé that shows how to program an fcl-web CGI application; includes example of generating JSON content](<https://github.com/leonardorame/Ext4-MVC-Tutorial/wiki/Lazarus-Server>)
506506
507507---
508-*From the Free Pascal wiki, page "fcl-web/fr", as the Internet Archive kept it on 2025-01-22. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*
508+*From the Free Pascal wiki, page "fcl-web/fr", as the Internet Archive kept it on 2025-01-22, last changed on 2020-05-01. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history