Sign in Join
Wiki copytemporary

fcl-web/fr: what changed

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

OldNewLine
1-## Contents
2-
3- * 1 Qu'est ce que fpWeb ?
4- * 2 Utilisation de fpWeb avec Lazarus
5- * 2.1 Installation du paquet Lazarus fpWeb weblaz
6- * 2.2 Création d'une application CGI
7- * 2.3 Déploiement d'une application CGI
8- * 2.4 Formatage du HTML and lecture des champs de requête
9- * 2.5 Lecture des données GET
10- * 2.6 Lecture des données POST
11- * 2.7 Lecture des données binaire POST
12- * 3 Modules spécialisés
13- * 4 Utiliser de multiples modules
14- * 5 Utilisation des actions
15- * 6 Utilisation des patrons HTML
16- * 7 Conseils & résolution de problèmes
17- * 7.1 Envoi des codes de retour
18- * 7.2 Envoi de données binaires
19- * 7.3 Erreur: "Could not determine HTTP module for request"
20- * 7.4 Erreur: "response code 500 Internal Server error when trying to handle DELETE method"
21- * 7.5 fpWeb/FCGI et Apache 2.4 (mode mod_proxy_fcgi)
22- * 7.6 fpWeb/FCGI et nginx
23- * 8 Notes
24- * 9 Voir aussi
25-
261## Qu'est ce que fpWeb ?
272
283fpWeb peut être utilisé pour construire des applications Web serveur. Une application serveur Web peut être l'une des suivantes:
294
305 * Application CGI.
316 * Application FastCGI.
327 * Module Apache.
338 * Serveur HTTP(s) autonome utilisant les composants Free Pascal HTTP server.
349 * Serveur HTTP(s) autonome utilisant libmicrohttp de GNU.
3510 * Application Windows SysHTTP.
3611
3712Dans 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.
3813
3914Dans 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.
4015
4116Il 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]].
4217
4318## Utilisation de fpWeb avec Lazarus
4419
4520### Installation du paquet Lazarus fpWeb weblaz
4621
4722The 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.
4823
4924### Création d'une application CGI
5025
5126Aprè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.
5227
5328[![New cgi.PNG](/wiki-images/e/ec/New_cgi.PNG)](</File:New_cgi.PNG>)
5429
5530Le TFPWebModule vous permet de manipuler des propriétés et des événements utilisant l'inspecteur d'objet.
5631
5732Pour 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:
5833
5934[![Webmodule.PNG](/wiki-images/3/3d/Webmodule.PNG)](</File:Webmodule.PNG>)
6035
6136Dans 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()`.
6237
6338Le 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'`.
6439
6540Finalement, `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 :
6641```
6742unit mainpage;
6843
6944 {$mode objfpc}{$H+}
7045
7146 interface
7247
7348 uses
7449 Classes, SysUtils, FileUtil, HTTPDefs, websession, fpHTTP, fpWeb;
7550
7651 type
7752
7853 { TFPWebModule1 }
7954
8055 TFPWebModule1 = class(TFPWebModule)
8156 procedure DataModuleRequest(Sender: TObject; ARequest: TRequest;
8257 AResponse: TResponse; var Handled: Boolean);
8358 private
8459 { private declarations }
8560 public
8661 { public declarations }
8762 end;
8863
8964 var
9065 FPWebModule1: TFPWebModule1;
9166
9267 implementation
9368
9469 {$R *.lfm}
9570
9671 { TFPWebModule1 }
9772
9873 procedure TFPWebModule1.DataModuleRequest(Sender: TObject; ARequest: TRequest;
9974 AResponse: TResponse; var Handled: Boolean);
10075 begin
10176 AResponse.ContentType := 'text/html;charset=utf-8';
10277 AResponse.Contents.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'mainpage.html');
10378 Handled := True;
10479 end;
10580
10681 begin
10782 RegisterHTTPModule('TFPWebModule1', TFPWebModule1);
10883 end.
10984```
11085
11186### Déploiement d'une application CGI
11287
11388Cette 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é.
11489
11590Apache peut être téléchargé [ici](<http://httpd.apache.org/download.cgi>) ou installé en utilisant le gestionnaire de paquets de votre distribution.
11691
11792L'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 :
11893```
11994#
12095 # ScriptAlias: This controls which directories contain server scripts.
12196 # ScriptAliases are essentially the same as Aliases, except that
12297 # documents in the target directory are treated as applications and
12398 # run by the server when requested rather than as documents sent to the
12499 # client. The same rules about trailing "/" apply to ScriptAlias
125100 # directives as to Alias.
126101 #
127102 ScriptAlias /cgi-bin/ "C:/Program Files/Apache Software Foundation/Apache2.2/cgi-bin/"
128103```
129104
130105Si 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).
131106
132107fcl-web avec Lazarus sur Windows produit des fichiers .exe. Pour qu'Apache serve ces fichiers, vous devez ajouter ceci:
133108```
134109AddHandler cgi-script .exe
135110```
136111
137112Et pour servir vos exécutables depuis un autre répertoire, vous ajoutez ceci :
138113```
139114ScriptAlias /bin/ "C:/lazarus_projects/test-fclweb/bin/"
140115 <Directory "C:/lazarus_projects/test-fclweb/bin/">
141116 AllowOverride None
142117 Options None
143118 Order allow,deny
144119 Allow from all
145120 </Directory>
146121```
147122
148123### Formatage du HTML and lecture des champs de requête
149124
150125L'exemple précédent montrait juste une simple page HTML. On pourrait désirer p.ex. :
151126
152127 * changer dynamiquement la sortie de la page HTML, et
153128 * 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).
154129
155130Une 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.
156131
157132### Lecture des données GET
158133
159134Pour 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).
160135
161136Le code résultant :
162137```
163138procedure TFPWebModule1.DataModuleRequest(Sender: TObject; ARequest: TRequest;
164139 AResponse: TResponse; var Handled: Boolean);
165140 var
166141 HexText, AsciiText: string;
167142 begin
168143 HexText := ARequest.QueryFields.Values['hex'];
169144 AsciiText := HexToAnsii(HexText);
170145
171146 AResponse.ContentType := 'text/html;charset=utf-8';
172147 AResponse.Contents.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'mainpage.html');
173148 AResponse.Contents.Text := Format(AResponse.Contents.Text,
174149 [HexText, AsciiText]);
175150 Handled := True;
176151 end;
177152```
178153
179154### Lecture des données POST
180155
181156Les 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.
182157
183158Les 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 :
184159```
185160login: dfg 345&&
186161 login_senha: ====
187162 email: dfg
188163```
189164
190165Sera décodé en 'APPLICATION/X-WWW-FORM-URLENCODED' comme ceci (voir [wikipedia POST (HTTP)](<http://en.wikipedia.org/wiki/POST_%28HTTP%29>)):
191166```
192167login=dfg+345%26%26&login_senha=%3D%3D%3D%3D&email=dfg
193168```
194169
195170Et sera disponible dans `TRequest.ContentFields` via l'index de ligne ou en utilisant la propriété `Values`, ce qui est plus pertinent :
196171```
197172TRequest.ContentFields[0]: login=dfg 345&&
198173 TRequest.ContentFields[1]: login_senha=====
199174 TRequest.ContentFields[2]: email=dfg
200175 TRequest.ContentFields.Values['email']: dfg
201176```
202177
203178En 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) :
204179
205180 * le contenu est uniquement disponible dans `TRequest.Content` et non pas `TRequest.ContentFields`.
206181 * l'usage de ces types MIME lève un exception pour FPC 2.4.2 (corrigé dans FPC 2.5+).
207182
208183Remarquez 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.
209184```
210185procedure TFPWebModule1.DataModuleRequest(Sender: TObject; ARequest: TRequest;
211186 AResponse: TResponse; var Handled: Boolean);
212187 var
213188 lData: String;
214189 begin
215190 lData := ARequest.Content;
216191```
217192
218193### Lecture des données binaire POST
219194
220195Les 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.
221196
222197Pour recevoir des données sur le serveur qui a été POSTé p.ex comme multipart/form-data, utilisez quelques chose comme ceci :
223198```
224199procedure TMainWebModule.TFPWebActions2Request(Sender: TObject;
225200 ARequest: TRequest; AResponse: TResponse; var Handled: Boolean);
226201 var
227202 i: Integer;
228203 begin
229204 // Process all received files
230205 for i := 0 to ARequest.Files.Count - 1 do
231206 begin
232207 // Doing something else than writeln is highly recommended ;)
233208 writeln ('Received Filename: '+ARequest.Files[i].LocalFileName);
234209 end;
235210
236211 Handled := true;
237212 end;
238213```
239214
240215Le client peut envoyer des données en utilisant p.ex. `FileFormPost`.
241216
242217## Modules spécialisés
243218
244219La classe *`TFPWebModule`* (utilisée dessous) est un simple exemple de module Web quii peut être utilisé pour toutes sortes de requêtes HTTP..
245220
246221Toutefois, fpweb vient avec quelques modules spécialisés, qui réalisent des tâches spécialisés :
247222
248223 * 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.
249224 * La classe **TFPHTMLModule** dans l'unité _fphtml.pp_ peut être utlisé pour produire du HTML.
250225 * La classe **TProxyWebModule** dans l'unité _fpwebproxy.pp_ est un proxy de transmission (forwarding proxy) prêt à l'emploi.
251226 * La classe **TFPWebProviderDataModule** dans l'unité _fpwebdata.pp_ sert des données au format JSON qui peut être consommé par des magasins (stores) ExtJS.
252227 * La classe **TSQLDBRestModule** dans l'unité _sqldbrestmodule.pp_ implémente un serveur full REST appuyé par SQLDB. Voir plus d'informations dans [[SQLDBRestBridge]].
253228 * La classe **TJSONRPCModule** dans l'unité _webjsonrpc.pp_ implémente un service JSON-RPC.
254229 * La classe **TExtDirectModule** dans l'unité _fpextdirect.pp_ implémente une variante Ext.Direct d'un service JSON-RPC.
255230
256231## Utiliser de multiples modules
257232
258233Si il y a un seul module dans l'application Web, toutes les requêtes seront redirigées vers ce module.
259234
260235Comme 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'.
261236
262237FCL-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é.
263238
264239Chaque module est enregistré avec fcl-web dans la section 'initialisation de l'unité dans lequel il est défini:
265240```
266241RegisterHTTPModule('location', TMyModule);
267242```
268243
269244Le module sera alors invoqué si une URL de la forme
270245```
271246http://www.mysite.org/mycgi.cgi/location
272247```
273248
274249ou
275250```
276251http://www.mysite.org/mycgi.cgi?module=location
277252```
278253
279254est utilisée.
280255
281256Si plusieurs modules sont présents, le nom du module doit apparaître dans l'URL, ou une erreur sera levée.
282257
283258Ce 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` :
284259```
285260Application.AllowDefaultModule := False;
286261```
287262
288263Dans ce cas, l'application fcl-web requerra toujours le nom du module dans l'URL.
289264
290265Le 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
291266```
292267Application.ModuleVariable := 'm';
293268```
294269
295270assure que l'URL suivante est dirigée vers `TMyModule` :
296271```
297272http://www.mysite.org/mycgi.cgi?m=location
298273```
299274
300275Si 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` :
301276```
302277type
303278 TGetModuleEvent = Procedure (Sender : TObject; ARequest : TRequest;
304279 Var ModuleClass : TCustomHTTPModuleClass) of object;
305280```
306281
307282La 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.
308283
309284Si `ModuleClass` vaut `Nil` au retour, une erreur sera envoyée au navigateur.
310285
311286## Utilisation des actions
312287
313288Un 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 :
314289
315290 * Création
316291 * Suppression
317292 * Mise à jour
318293 * Affichage
319294
320295Ces différentes actions peuvent être maniée par le mêm module. On peut déterminer l'action depuis l'URL manuellement, comme dans :
321296```
322297http://mysite/mycgi.cgi/user?action=delete&id=12
323298```
324299
325300Cela peut être automatisé.
326301
327302Afin 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 :
328303
329-`Name`
330- Le nom de l'action. L'URL sera examinée pour déterminer le nom de l'action.
331-`Content`
332- Une chaîne de caractères. Si définie, c'est envoyé vers le navigateur.
333-`Contents`
334- Une TStringList. c'est envoyé vers le navigateur.
335-`ContentProducer`
336- Si définie, the ContentProducer maniera la requête.
337-`Default`
338- 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.
339-`Template`
340- Si définie, ce patron sera traité et les résultats envoyés vers le navigateur.
304+**`Name`**
341305
306+Le nom de l'action. L'URL sera examinée pour déterminer le nom de l'action.
307+
308+**`Content`**
309+
310+Une chaîne de caractères. Si définie, c'est envoyé vers le navigateur.
311+
312+**`Contents`**
313+
314+Une TStringList. c'est envoyé vers le navigateur.
315+
316+**`ContentProducer`**
317+
318+Si définie, the ContentProducer maniera la requête.
319+
320+**`Default`**
321+
322+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.
323+
324+**`Template`**
325+
326+Si définie, ce patron sera traité et les résultats envoyés vers le navigateur.
327+
342328Il y a aussi quelques événements :
343329
344-`BeforeRequest`
345- 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.
346-`AfterRequest`
347- exécuté après le traitement de la requête.
348-`OnRequest`
349- un gestionnaire d'événement pour manier la requête. Si défini, le gstionnaire est utilisé pour manier la requête.
330+**`BeforeRequest`**
331+
332+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.
333+
334+**`AfterRequest`**
335+
336+exécuté après le traitement de la requête.
337+
338+**`OnRequest`**
339+
340+un gestionnaire d'événement pour manier la requête. Si défini, le gstionnaire est utilisé pour manier la requête.
350341
351342Encore 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:
352343```
353344http://mysite/mycgi.cgi/user/delete&id=12
354345```
355346
356347exécutera l'action nommée 'delete'.
357348
358349La propriété `ActionVar` du module peut être utilisée pour définir le nom de la variable de requête à utiliser. En affectant :
359350```
360351UserModule.ActionVar := 'a';
361352```
362353
363354peut être utilisé pour changer l'URL du dessus en :
364355```
365356http://mysite/mycgi.cgi/user?a=delete&id=12
366357```
367358
368359S'il y a seulement un module dans l'application, l'URL peut être raccourci en :
369360```
370361http://mysite/mycgi.cgi/delete&id=12
371362```
372363
373364## Utilisation des patrons HTML
374365
375366Pour 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)
376367
377368Des 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).
378369
379370(Dans les versions antérieures, ces exemples se trouvaient dans le répertoire Lazarus dans `/components/fpweb/demo/fptemplate/`)
380371
381372## Conseils & résolution de problèmes
382373
383374### Envoi des codes de retour
384375
385376Pour envoyer une réponse HTTP différente de 200 OK, utiliser `AResponse.Code` et `AResponse.CodeText`, p.ex. :
386377```
387378AResponse.Code := 404;
388379 AResponse.CodeText := 'Document not found';
389380```
390381
391382### Envoi de données binaires
392383
393384Une 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 :
394385```
395386AResponse.ContentStream := TMemoryStream.Create;
396387
397388 try
398389 AResponse.ContentStream.LoadFromFile('/tmp/sample.tiff');
399390 AResponse.ContentType := 'image/tiff'; //or whatever MIME type you want to send
400391 // to do: there is an fpweb example that gets the mime type from the file extension...
401392 AResponse.ContentLength:=AResponse.ContentStream.Size; //apparently doesn't happen automatically?
402393 AResponse.SendContent;
403394 finally
404395 AResponse.ContentStream.Free;
405396 end;
406397
407398 Handled := true;
408399```
409400
410401### Erreur: "Could not determine HTTP module for request"
411402
412403Vous pouvez avoir de multiples modules et de multiples actions. Si vous spécifiez une URL avec un seul item, comme :
413404```
414405http://localhost/cgi-bin/somemodule
415406```
416407
417408alors 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)".
418409
419410Vous 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`.
420411
421412### Erreur: "response code 500 Internal Server error when trying to handle DELETE method"
422413
423414Dans FPC 2.6.2 et antérieur, fcl-web n'accepte pas la méthode DELETE et génère une erreur.
424415
425416### fpWeb/FCGI et Apache 2.4 (mode mod_proxy_fcgi)
426417
427418Quand 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.
428419
4294201, Activer les modules suivants: setenvif_module, proxy_module et proxy_fcgi_module
430421
431422(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)`.
432423```
433424LoadModule setenvif_module modules/mod_setenvif.so
434425 LoadModule proxy_module modules/mod_proxy.so
435426 LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
436427```
437428
4384292, Configuration du proxy inverse pour fpWeb/FCGI écoutant sur le port 9000.
439430$1 = module name
440431$2 = action name
441432```
442433SetEnvIf Request_URI . proxy-fcgi-pathinfo=full
443434 ProxyPassMatch "/fcgi/(.*)/(.*)" "fcgi://127.0.0.1:9000/$1/$2"
444435```
445436
446437### fpWeb/FCGI et nginx
447438
448439Pour 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_.
449440
450441L'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.
451442```
452443server {
453444
454445 listen 8080;
455446 listen [::]:8080;
456447
457448 server_name _;
458449
459450 root "/var/www";
460451
461452 location /mycgiap/ {
462453 # setting up PATH_INFO
463454 fastcgi_split_path_info ^(/mycgiapp/)(.*)$;
464455 fastcgi_param PATH_INFO $fastcgi_path_info;
465456
466457 # other parameters
467458 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
468459 fastcgi_param QUERY_STRING $query_string;
469460 fastcgi_param REQUEST_METHOD $request_method;
470461 fastcgi_param CONTENT_TYPE $content_type;
471462 fastcgi_param CONTENT_LENGTH $content_length;
472463 fastcgi_param SCRIPT_NAME $fastcgi_script_name;
473464 fastcgi_param REQUEST_URI $request_uri;
474465 fastcgi_param DOCUMENT_URI $document_uri;
475466 fastcgi_param DOCUMENT_ROOT $document_root;
476467 fastcgi_param SERVER_PROTOCOL $server_protocol;
477468 fastcgi_param REQUEST_SCHEME $scheme;
478469 fastcgi_param HTTPS $https if_not_empty;
479470 fastcgi_param GATEWAY_INTERFACE CGI/1.1;
480471 fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
481472 fastcgi_param REMOTE_ADDR $remote_addr;
482473 fastcgi_param REMOTE_PORT $remote_port;
483474 fastcgi_param SERVER_ADDR $server_addr;
484475 fastcgi_param SERVER_PORT $server_port;
485476 fastcgi_param SERVER_NAME $server_name;
486477
487478 # pass requests to your FastCGI application
488479 fastcgi_pass 127.0.0.1:9000;
489480 }
490481 }
491482```
492483
493484## Notes
494485
495486 * L'unité cgiapp est dépréciée, veuillez utiliser fpcgi autant que possible.
496487 * 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é.
497488 * 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é.
498489
499490## Voir aussi
500491
501492 * [[fpWeb Tutorial]]
502493 * [[fphttpclient]] Partie de fcl-web qui peut être utilisé de manière autonome dans des applications clientes.
503494 * _write me!_ fphttpserver Petit serveur Web autonome en Pascal Objet. Peut être utilisé pour servir des applications CGI fcl-web.
504495 * [[CGI Web Programming/fr|Débogage de CGI]] Information concernant le débogage des applications CGI.
505496 * [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>)
506497
507498---
508499*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