summaryrefslogtreecommitdiffstats
path: root/docs/manual/rewrite/rewrite_guide_advanced.html.fr
blob: eaff3aac91b6960c16d2ad8786ecacc803d57d88 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="fr" xml:lang="fr"><head><!--
        XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
              This file is generated from xml source: DO NOT EDIT
        XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
      -->
<title>Guide de r��criture des URLs - Sujets avanc�s - Serveur Apache HTTP</title>
<link href="/style/css/manual.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet" />
<link href="/style/css/manual-loose-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size" />
<link href="/style/css/manual-print.css" rel="stylesheet" media="print" type="text/css" />
<link href="/images/favicon.ico" rel="shortcut icon" /></head>
<body id="manual-page"><div id="page-header">
<p class="menu"><a href="/mod/">Modules</a> | <a href="/mod/directives.html">Directives</a> | <a href="/faq/">FAQ</a> | <a href="/glossary.html">Glossaire</a> | <a href="/sitemap.html">Plan du site</a></p>
<p class="apache">Serveur Apache HTTP Version 2.3</p>
<img alt="" src="/images/feather.gif" /></div>
<div class="up"><a href="./"><img title="&lt;-" alt="&lt;-" src="/images/left.gif" /></a></div>
<div id="path">
<a href="http://www.apache.org/">Apache</a> &gt; <a href="http://httpd.apache.org/">Serveur HTTP</a> &gt; <a href="http://httpd.apache.org/docs/">Documentation</a> &gt; <a href="/">Version 2.3</a> &gt; <a href="./">Rewrite</a></div><div id="page-content"><div id="preamble"><h1>Guide de r��criture des URLs - Sujets avanc�s</h1>
<div class="toplang">
<p><span>Langues Disponibles: </span></p>
</div>


    <p>Ce document compl�mente la
    <a href="../mod/mod_rewrite.html">documentation de r�f�rence</a> du
    module <code class="module"><a href="/mod/mod_rewrite.html">mod_rewrite</a></code>. Il d�crit les diff�rentes
    mani�res d'utiliser le module d'Apache <code class="module"><a href="/mod/mod_rewrite.html">mod_rewrite</a></code>
    pour r�soudre les probl�mes d'URLs typiques auxquels sont souvent
    confront�s les webmasters. Nous fournissons une description
    d�taill�e de la r�solution de chaque probl�me par la configuration
    d'un jeu de r�gles de r��criture.</p>

    <div class="warning">ATTENTION: il pourra s'av�rer n�cessaire de
    modifier les exemples en fonction de la
    configuration de votre serveur, par exemple en ajoutant le drapeau
    <code>[PT]</code> si les modules <code class="module"><a href="/mod/mod_alias.html">mod_alias</a></code> et
    <code class="module"><a href="/mod/mod_userdir.html">mod_userdir</a></code> sont utilis�s, etc... Les jeux de
    r�gles devront �galement �tre adapt�s pour passer d'un contexte de
    serveur � un contexte de r�pertoire (fichiers
    <code>.htaccess</code>). Essayez de toujours bien comprendre ce que
    fait un jeu de r�gles avant de l'utiliser, ce qui pourra vous �viter
    bien des probl�mes.</div>

  </div>
<div id="quickview"><ul id="toc"><li><img alt="" src="/images/down.gif" /> <a href="#cluster">Acc�s � une grappe de serveurs via un espace d'adressage
      compatible</a></li>
<li><img alt="" src="/images/down.gif" /> <a href="#structuredhomedirs">R�pertoires utilisateurs structur�s</a></li>
<li><img alt="" src="/images/down.gif" /> <a href="#filereorg">R�organisation du syst�me de fichiers</a></li>
<li><img alt="" src="/images/down.gif" /> <a href="#redirect404">Rediriger les URLs erron�es vers un autre serveur Web</a></li>
<li><img alt="" src="/images/down.gif" /> <a href="#archive-access-multiplexer">Multiplexeur d'acc�s aux archives</a></li>
<li><img alt="" src="/images/down.gif" /> <a href="#browser-dependent-content">Contenu d�pendant du navigateur</a></li>
<li><img alt="" src="/images/down.gif" /> <a href="#dynamic-mirror">Miroir dynamique</a></li>
<li><img alt="" src="/images/down.gif" /> <a href="#reverse-dynamic-mirror">Miroir dynamique inverse</a></li>
<li><img alt="" src="/images/down.gif" /> <a href="#retrieve-missing-data">R�cup�rer des donn�es manquantes depuis l'Intranet</a></li>
<li><img alt="" src="/images/down.gif" /> <a href="#load-balancing">R�partition de charge</a></li>
<li><img alt="" src="/images/down.gif" /> <a href="#new-mime-type">Nouveau type MIME, nouveau service</a></li>
<li><img alt="" src="/images/down.gif" /> <a href="#on-the-fly-content">R�g�neration de contenu � la vol�e</a></li>
<li><img alt="" src="/images/down.gif" /> <a href="#autorefresh">Actualisation automatique d'un document</a></li>
<li><img alt="" src="/images/down.gif" /> <a href="#mass-virtual-hosting">H�bergement virtuel de masse</a></li>
<li><img alt="" src="/images/down.gif" /> <a href="#host-deny">Interdiction d'h�tes</a></li>
<li><img alt="" src="/images/down.gif" /> <a href="#proxy-deny">Interdiction du mandataire</a></li>
<li><img alt="" src="/images/down.gif" /> <a href="#special-authentication">Variante particuli�re d'authentification</a></li>
<li><img alt="" src="/images/down.gif" /> <a href="#referer-deflector">Redirection bas�e sur le r�f�rent</a></li>
</ul><h3>Voir aussi</h3><ul class="seealso"><li><a href="../mod/mod_rewrite.html">Documentation du
module</a></li><li><a href="intro.html">Introduction �
mod_rewrite</a></li><li><a href="rewrite_guide.html">Guide de r��criture - exemples
utiles</a></li><li><a href="tech.html">D�tails techniques</a></li></ul></div>
<div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div>
<div class="section">
<h2><a name="cluster" id="cluster">Acc�s � une grappe de serveurs via un espace d'adressage
      compatible</a></h2>

      

      <dl>
        <dt>Description :</dt>

        <dd>
          <p>Comment cr�er un espace d'adressage homog�ne et compatible
	  avec
	  tous les serveurs WWW d'une grappe de serveurs d'un intranet ?
	  C'est � dire que toutes les URLs (par d�finition
	  locales � un
	  serveur et d�pendant donc de celui-ci) deviennent
	  v�ritablement <em>ind�pendantes</em> du serveur ! Nous voulons
	  disposer, pour acc�der � l'espace de nommage WWW, d'un seul
	  espace d'adressage compatible : aucune URL ne
	  doit inclure d'information quelconque � propos du serveur
	  cible physique. La grappe de serveurs doit elle-m�me nous
	  diriger automatiquement vers le bon serveur cible physique,
	  selon les besoins, et ceci de mani�re transparente.</p>
        </dd>

        <dt>Solution :</dt>

        <dd>
          <p>Tout d'abord, la connaissance des serveurs cibles est issue
	  de tables de correspondances externes (distribu�es) qui
	  contiennent des informations sur la localisation de nos
	  utilisateurs, groupes et entit�s. Elles se pr�sentent sous la
	  forme :</p>

<div class="example"><pre>
utilisateur1  serveur_utilisateur1
utilisateur2  serveur_utilisateur2
:      :
</pre></div>

          <p>On les enregistre sous forme de fichiers
	  <code>map.xxx-vers-serveur</code>. On doit ensuite faire
	  rediriger � tous les serveurs les URLs de la forme :</p>

<div class="example"><pre>
/u/utilisateur/chemin
/g/groupe/chemin
/e/entit�/chemin
</pre></div>

          <p>vers</p>

<div class="example"><pre>
http://serveur-physique/u/utilisateur/chemin
http://serveur-physique/g/groupe/chemin
http://serveur-physique/e/entit�/chemin
</pre></div>

          <p>si il n'est pas n�cessaire que chaque chemin d'URL �tre valide sur chaque
	  serveur. Le jeu
	  de r�gles suivant le fait pour nous � l'aide des fichiers de
	  correspondance (en supposant que serveur0 soit un serveur par
	  d�faut qui sera choisi si l'utilisateur ne poss�de aucune
	  entr�e dans la table) :</p>

<div class="example"><pre>
RewriteEngine on

RewriteMap      utilisateur-vers-serveur   txt:/chemin/vers/map.utilisateur-vers-serveur
RewriteMap     groupe-vers-serveur   txt:/chemin/vers/map.groupe-vers-serveur
RewriteMap    entit�-vers-serveur   txt:/chemin/vers/map.entit�-vers-serveur

RewriteRule   ^/u/<strong>([^/]+)</strong>/?(.*)
http://<strong>${utilisateur-vers-serveur:$1|serveur0}</strong>/u/$1/$2
RewriteRule   ^/g/<strong>([^/]+)</strong>/?(.*)
http://<strong>${groupe-vers-serveur:$1|serveur0}</strong>/g/$1/$2
RewriteRule   ^/e/<strong>([^/]+)</strong>/?(.*)
http://<strong>${entit�-vers-serveur:$1|serveur0}</strong>/e/$1/$2

RewriteRule   ^/([uge])/([^/]+)/?$          /$1/$2/.www/
RewriteRule   ^/([uge])/([^/]+)/([^.]+.+)   /$1/$2/.www/$3\
</pre></div>
        </dd>
      </dl>

    </div><div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div>
<div class="section">
<h2><a name="structuredhomedirs" id="structuredhomedirs">R�pertoires utilisateurs structur�s</a></h2>

      

      <dl>
        <dt>Description :</dt>

        <dd>
          <p>Certains sites poss�dant des milliers d'utilisateurs
	  organisent les r�pertoires home de mani�re
	  structur�e, <em>c'est � dire</em> que chaque r�pertoire home
	  se situe dans un sous-r�pertoire dont le nom commence (par
	  exemple) par le premier caract�re du nom de l'utilisateur.
	  Ainsi, <code>/~foo/chemin</code> est dans
	  <code>/home/<strong>f</strong>/foo/.www/chemin</code>, tandis
	  que <code>/~bar/chemin</code> est dans
	  <code>/home/<strong>b</strong>/bar/.www/chemin</code>.</p>
        </dd>

        <dt>Solution :</dt>

        <dd>
          <p>Le jeu de r�gles suivant permet de d�velopper les URLs avec
	  tilde selon la repr�sentation ci-dessus.</p>

<div class="example"><pre>
RewriteEngine on
RewriteRule   ^/~(<strong>([a-z])</strong>[a-z0-9]+)(.*)  /home/<strong>$2</strong>/$1/.www$3
</pre></div>
        </dd>
      </dl>

    </div><div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div>
<div class="section">
<h2><a name="filereorg" id="filereorg">R�organisation du syst�me de fichiers</a></h2>

      

      <dl>
        <dt>Description :</dt>

        <dd>
          <p>Voici un cas d'esp�ce : une application tr�s efficace qui
	  fait un usage intensif de r�gles <code>RewriteRule</code>
	  dans le contexte du r�pertoire pour pr�senter un aspect
	  compr�hensible sur le Web sans modifier la structure des
	  donn�es.
	  Les coulisses de l'affaire : <strong><em>net.sw</em></strong>
	  rassemble mes archives de paquetages de logiciels Unix
	  librement accessibles, que j'ai commenc� � collectionner en
	  1992. Pour moi, c'est un passe-temps, mais aussi un travail,
	  car alors que j'�tudie la science informatique, j'ai aussi
	  travaill� depuis de nombreuses ann�es comme administrateur
	  syst�me et r�seau � mes heures perdues. Chaque semaine j'ai
	  besoin de tel ou tel logiciel, et j'ai donc cr�� une
	  arborescence tr�s ramifi�e de r�pertoires o� je stocke les
	  paquetages :</p>

<div class="example"><pre>
drwxrwxr-x   2 netsw  users    512 Aug  3 18:39 Audio/
drwxrwxr-x   2 netsw  users    512 Jul  9 14:37 Benchmark/
drwxrwxr-x  12 netsw  users    512 Jul  9 00:34 Crypto/
drwxrwxr-x   5 netsw  users    512 Jul  9 00:41 Database/
drwxrwxr-x   4 netsw  users    512 Jul 30 19:25 Dicts/
drwxrwxr-x  10 netsw  users    512 Jul  9 01:54 Graphic/
drwxrwxr-x   5 netsw  users    512 Jul  9 01:58 Hackers/
drwxrwxr-x   8 netsw  users    512 Jul  9 03:19 InfoSys/
drwxrwxr-x   3 netsw  users    512 Jul  9 03:21 Math/
drwxrwxr-x   3 netsw  users    512 Jul  9 03:24 Misc/
drwxrwxr-x   9 netsw  users    512 Aug  1 16:33 Network/
drwxrwxr-x   2 netsw  users    512 Jul  9 05:53 Office/
drwxrwxr-x   7 netsw  users    512 Jul  9 09:24 SoftEng/
drwxrwxr-x   7 netsw  users    512 Jul  9 12:17 System/
drwxrwxr-x  12 netsw  users    512 Aug  3 20:15 Typesetting/
drwxrwxr-x  10 netsw  users    512 Jul  9 14:08 X11/
</pre></div>

          <p>J'ai d�cid� en 1996 de rendre cette archive disponible pour
	  le monde via une interface web agr�able. "Agr�able" signifie
	  que je voulais vous offrir une interface o� vous pourriez
	  naviguer directement � travers la hi�rarchie des archives.
	  Mais "agr�able" signifie aussi que je ne voulais rien changer
	  dans cette hi�rarchie - m�me pas en ajoutant queques scripts
	  CGI � son sommet. Pourquoi ? Parceque j'avais pr�vu de rendre
	  ult�rieurement la structure ci-dessus accessible aussi via
	  FTP, et je ne voulais pas voir de fichiers CGI ou Web � ce
	  niveau.</p>
        </dd>

        <dt>Solution :</dt>

        <dd>
          <p>La solution comporte deux parties : la premi�re consiste en
	  un ensemble de scripts CGI qui cr�ent toutes les pages � tous
	  les niveaux de r�pertoires � la vol�e. Je les ai plac�s dans
	  <code>/e/netsw/.www/</code> comme suit :</p>

<div class="example"><pre>
-rw-r--r--   1 netsw  users    1318 Aug  1 18:10 .wwwacl
drwxr-xr-x  18 netsw  users     512 Aug  5 15:51 DATA/
-rw-rw-rw-   1 netsw  users  372982 Aug  5 16:35 LOGFILE
-rw-r--r--   1 netsw  users     659 Aug  4 09:27 TODO
-rw-r--r--   1 netsw  users    5697 Aug  1 18:01 netsw-about.html
-rwxr-xr-x   1 netsw  users     579 Aug  2 10:33 netsw-access.pl
-rwxr-xr-x   1 netsw  users    1532 Aug  1 17:35 netsw-changes.cgi
-rwxr-xr-x   1 netsw  users    2866 Aug  5 14:49 netsw-home.cgi
drwxr-xr-x   2 netsw  users     512 Jul  8 23:47 netsw-img/
-rwxr-xr-x   1 netsw  users   24050 Aug  5 15:49 netsw-lsdir.cgi
-rwxr-xr-x   1 netsw  users    1589 Aug  3 18:43 netsw-search.cgi
-rwxr-xr-x   1 netsw  users    1885 Aug  1 17:41 netsw-tree.cgi
-rw-r--r--   1 netsw  users     234 Jul 30 16:35 netsw-unlimit.lst
</pre></div>

          <p>Le sous-r�pertoire <code>DATA/</code> contient la structure
	  de r�pertoires proprement dite mentionn�e plus haut, <em>c'est
	  � dire</em> les v�ritables ressources
	  <strong><em>net.sw</em></strong> et est mis � jour
	  automatiquement via <code>rdist</code> � intervalles de temps
	  r�guliers. Reste la seconde partie du probl�me : comment
	  relier ces deux structures selon une arborescence d'URL
	  facile d'acc�s ? Il nous faut cacher le r�pertoire
	  <code>DATA/</code> � l'utilisateur durant l'ex�cution des
	  scripts CGI appropri�s aux diff�rentes URLs. Voici comment :
	  tout d'abord, j'ajoute ces deux r�gles dans le fichier de
	  configuration du r�pertoire racine <code class="directive"><a href="/mod/core.html#documentroot">DocumentRoot</a></code> du serveur afin de
	  r��crire le chemin d'URL public <code>/net.sw/</code> vers le
	  chemin interne <code>/e/netsw</code> :</p>

<div class="example"><pre>
RewriteRule  ^net.sw$       net.sw/        [R]
RewriteRule  ^net.sw/(.*)$  e/netsw/$1
</pre></div>

          <p>La premi�re r�gle concerne les requ�tes qui ne comportent
	  pas de slash de fin ! C'est la seconde r�gle qui fait le
	  v�ritable travail. Et maintenant vient la super configuration
	  qui se trouve dans le fichier de configuration de r�pertoire
	  <code>/e/netsw/.www/.wwwacl</code> :</p>

<div class="example"><pre>
Options       ExecCGI FollowSymLinks Includes MultiViews

RewriteEngine on

#  l'acc�s s'effectue via le pr�fixe /net.sw/
RewriteBase   /net.sw/

#  tout d'abord, on r��crit le r�pertoire racine vers
#  le script CGI qui lui est associ�
RewriteRule   ^$                       netsw-home.cgi     [L]
RewriteRule   ^index\.html$            netsw-home.cgi     [L]

#  on supprime les sous-r�pertoires lorsque
#  le navigateur nous atteint depuis des pages de r�pertoire
RewriteRule   ^.+/(netsw-[^/]+/.+)$    $1                 [L]

#  on stoppe maintenant la r��criture pour les fichiers locaux
RewriteRule   ^netsw-home\.cgi.*       -                  [L]
RewriteRule   ^netsw-changes\.cgi.*    -                  [L]
RewriteRule   ^netsw-search\.cgi.*     -                  [L]
RewriteRule   ^netsw-tree\.cgi$        -                  [L]
RewriteRule   ^netsw-about\.html$      -                  [L]
RewriteRule   ^netsw-img/.*$           -                  [L]

#  ce qui reste est un sous-r�pertoire qui peut �tre trait�
#  par un autre script CGI
RewriteRule   !^netsw-lsdir\.cgi.*     -                  [C]
RewriteRule   (.*)                     netsw-lsdir.cgi/$1
</pre></div>

          <p>Quelques indices pour l'interpr�tation :</p>

          <ol>
            <li>Remarquez le drapeau <code>L</code> (last) et l'absence
	    de cha�ne de substitution ('<code>-</code>') dans la
	    quatri�me partie.</li>

            <li>Remarquez le caract�re <code>!</code> (not)  et le
	    drapeau <code>C</code> (chain) dans la premi�re r�gle de la
	    derni�re partie.</li>

            <li>Remarquez le mod�le qui correspond � tout dans la
	    derni�re r�gle.</li>
          </ol>
        </dd>
      </dl>

    </div><div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div>
<div class="section">
<h2><a name="redirect404" id="redirect404">Rediriger les URLs erron�es vers un autre serveur Web</a></h2>

      

      <dl>
        <dt>Description :</dt>

        <dd>
          <p>Une question typique de la FAQ � propos de la r��criture
	  revient souvent : comment rediriger vers un serveur B les
	  requ�tes qui �chouent sur un serveur A ? On s'acquitte en
	  g�n�ral de cette t�che via des scripts CGI <code class="directive"><a href="/mod/core.html#errordocument">ErrorDocument</a></code> en Perl, mais il
	  existe aussi une solution avec <code class="module"><a href="/mod/mod_rewrite.html">mod_rewrite</a></code>.
	  Notez cependant que les performances sont moindres qu'avec
	  l'utilisation d'un script CGI <code class="directive"><a href="/mod/core.html#errordocument">ErrorDocument</a></code> !</p>
        </dd>

        <dt>Solution :</dt>

        <dd>
          <p>La premi�re solution poss�de des performances sup�rieures
	  mais moins de souplesse, et est moins sure :</p>

<div class="example"><pre>
RewriteEngine on
RewriteCond  %{DOCUMENT_ROOT/%{REQUEST_URI}  <strong>!-f</strong>
RewriteRule   ^(.+)                             http://<strong>serveurB</strong>.dom/$1
</pre></div>

          <p>Le probl�me r�side dans le fait que seules les pages
	  situ�es dans la racine <code class="directive"><a href="/mod/core.html#documentroot">DocumentRoot</a></code> seront redirig�es. Mais
	  m�me si vous pouvez ajouter des conditions suppl�mentaires (par
	  exemple pour traiter aussi les r�pertoires home, etc...), il
	  existe une meilleure solution :</p>

<div class="example"><pre>
RewriteEngine on
RewriteCond   %{REQUEST_URI} <strong>!-U</strong>
RewriteRule   ^(.+)          http://<strong>serveurB</strong>.dom/$1
</pre></div>
reprendre ici
          <p>On utilise ici la fonctionnalit� de pr�vision des URLs
	  futures de <code class="module"><a href="/mod/mod_rewrite.html">mod_rewrite</a></code>. Et cette solution
	  fonctionne pour tous les types d'URLs et de mani�re s�re. Par
	  contre, cette m�thode a un impact sur les performances du
	  serveur web, car chaque requ�te entra�ne le traitement d'une
	  sous-requ�te interne suppl�mentaire. Par cons�quent, vous
	  pouvez l'utiliser si votre serveur web s'ex�cute sur un CPU
	  puissant. Dans le cas d'une machine plus lente, utilisez la
	  premi�re approche, ou mieux, un script CGI <code class="directive"><a href="/mod/core.html#errordocument">ErrorDocument</a></code>.</p>
        </dd>
      </dl>

    </div><div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div>
<div class="section">
<h2><a name="archive-access-multiplexer" id="archive-access-multiplexer">Multiplexeur d'acc�s aux archives</a></h2>

      

      <dl>
        <dt>Description :</dt>

        <dd>
          <p>Connaissez-vous la grande archive CPAN (Comprehensive Perl Archive
          Network) situ�e � <a href="http://www.perl.com/CPAN">http://www.perl.com/CPAN</a> ?
	  CPAN redirige automatiquement les navigateurs vers un des
	  nombreux serveurs FTP r�partis � travers le monde
	  (g�n�ralement un serveur assez proche du client) ; chaque
	  serveur h�berge l'int�gralit� d'un miroir CPAN. Il s'agit ni
	  plus ni moins qu'un service d'acc�s FTP multiplex�. Alors que
	  le fonctionnement de l'archive CPAN repose sur des scripts
	  CGI, comment impl�menter une approche similaire avec
	  <code class="module"><a href="/mod/mod_rewrite.html">mod_rewrite</a></code> ?</p>
        </dd>

        <dt>Solution :</dt>

        <dd>
          <p>Premi�rement, remarquons que depuis la version 3.0.0,
	  <code class="module"><a href="/mod/mod_rewrite.html">mod_rewrite</a></code> accepte aussi le pr�fixe
	  "<code>ftp:</code>" dans les redirections. Et deuxi�mement,
	  l'approximation de la localisation peut �tre effectu�e par une
	  table de correspondances <code class="directive"><a href="/mod/mod_rewrite.html#rewritemap">RewriteMap</a></code>, en se basant sur
	  la racine du domaine du client. Un jeu de r�gles cha�n�es
	  astucieux nous permet d'utiliser cette racine du domaine comme
	  cl� de recherche dans notre table de correspondances de
	  multiplexage.</p>

<div class="example"><pre>
RewriteEngine on
RewriteMap    multiplex                txt:/chemin/vers/map.cxan
RewriteRule   ^/CxAN/(.*)              %{REMOTE_HOST}::$1                 [C]
RewriteRule   ^.+\.<strong>([a-zA-Z]+)</strong>::(.*)$
${multiplex:<strong>$1</strong>|ftp.d�faut.dom}$2  [R,L]
</pre></div>

<div class="example"><pre>
##
##  map.cxan -- Multiplexing Map for CxAN%{DOCUMENT_ROOT/%{REQUEST_URI}
##

de        ftp://ftp.cxan.de/CxAN/
uk        ftp://ftp.cxan.uk/CxAN/
com       ftp://ftp.cxan.com/CxAN/
 :
##EOF##
</pre></div>
        </dd>
      </dl>

    </div><div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div>
<div class="section">
<h2><a name="browser-dependent-content" id="browser-dependent-content">Contenu d�pendant du navigateur</a></h2>

      

      <dl>
        <dt>Description :</dt>

        <dd>
          <p>Il est parfois n�cessaire, au moins pour les pages
	  principales, de fournir un contenu optimum adapt� � chaque
	  type de navigateur, c'est � dire que l'on doit
	  fournir une version pour les navigateurs courants, une version
	  diff�rente pour les navigateurs en mode texte du style de
	  Lynx, et une autre pour les autres navigateurs.</p>
        </dd>

        <dt>Solution :</dt>

        <dd>
          <p>On ne peut pas utiliser la n�gociation de contenu car les
	  navigateurs ne fournissent pas leur type dans cette forme.
	  Nous devons nous baser sur l'en-t�te HTTP "User-Agent". La
	  configuration ci-dessous effectue les actions suivantes : si
	  l'en-t�te HTTP "User-Agent" commence par "Mozilla/3", la page
	  <code>foo.html</code> est r��crite en <code>foo.NS.html</code>
	  et la r��criture s'arr�te. Si le navigateur est "Lynx" ou
	  "Mozilla" version 1 ou 2, la page
	  <code>foo.html</code> est r��crite en
	  <code>foo.20.html</code>. Tous les autres navigateurs
	  re�oivent la page <code>foo.32.html</code>. Voici le jeu de
	  r�gles :</p>

<div class="example"><pre>
RewriteCond %{HTTP_USER_AGENT}  ^<strong>Mozilla/3</strong>.*
RewriteRule ^foo\.html$         foo.<strong>NS</strong>.html          [<strong>L</strong>]

RewriteCond %{HTTP_USER_AGENT}  ^<strong>Lynx/</strong>.*         [OR]
RewriteCond %{HTTP_USER_AGENT}  ^<strong>Mozilla/[12]</strong>.*
RewriteRule ^foo\.html$         foo.<strong>20</strong>.html          [<strong>L</strong>]

RewriteRule ^foo\.html$         foo.<strong>32</strong>.html          [<strong>L</strong>]
</pre></div>
        </dd>
      </dl>

    </div><div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div>
<div class="section">
<h2><a name="dynamic-mirror" id="dynamic-mirror">Miroir dynamique</a></h2>

      

      <dl>
        <dt>Description :</dt>

        <dd>
          <p>Supposons que nous voulions int�grer dans notre espace de
	  nommage de belles pages web situ�es sur un serveur distant.
	  Dans le cas d'un serveur FTP, nous aurions utilis� le
	  programme <code>mirror</code> qui maintient vraiment une copie
	  des donn�es distantes mise � jour explicitement sur le serveur
	  local. Pour un serveur web, nous pourrions utiliser le
	  programme <code>webcopy</code> qui utilise le protocole HTTP.
	  Ces deux techniques pr�sentent cependant un
	  inconv�nient majeur : la copie locale n'est v�ritablement �
	  jour qu'au moment o� nous avons lanc� le programme. Plut�t qu'
	  un miroir statique devant �tre d�fini explicitement, il serait
	  pr�f�rable d'avoir un miroir dynamique dont le contenu serait
	  mis � jour automatiquement, � la demande, sur le(s) serveur(s)
	  distant(s).</p>
        </dd>

        <dt>Solution :</dt>

        <dd>
          <p>Pour y parvenir, on fait
	  correspondre la page web ou m�me l'ensemble du
	  r�pertoire web distants � notre espace de nommage en utilisant
	  la fonctionnalit� <dfn>Mandataire</dfn> (drapeau
	  <code>[P]</code> ou <code>[proxy]</code>) :</p>

<div class="example"><pre>
RewriteEngine  on
RewriteBase    /~quux/
RewriteRule    ^<strong>page-convoit�e/</strong>(.*)$  <strong>http://www.tstimpreso.com/page-convoit�e/</strong>$1  [<strong>P</strong>]
</pre></div>

<div class="example"><pre>
RewriteEngine  on
RewriteBase    /~quux/
RewriteRule    ^<strong>usa-news\.html</strong>$   <strong>http://www.quux-corp.com/news/index.html</strong>  [<strong>P</strong>]
</pre></div>
        </dd>
      </dl>

    </div><div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div>
<div class="section">
<h2><a name="reverse-dynamic-mirror" id="reverse-dynamic-mirror">Miroir dynamique inverse</a></h2>

      

      <dl>
        <dt>Description :</dt>

        <dd>...</dd>

        <dt>Solution :</dt>

        <dd>
<div class="example"><pre>
RewriteEngine on
RewriteCond   /miroir/du/site-distant/$1           -U
RewriteRule   ^http://www\.site-distant\.com/(.*)$ /miroir/du/site-distant/$1
</pre></div>
        </dd>
      </dl>

    </div><div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div>
<div class="section">
<h2><a name="retrieve-missing-data" id="retrieve-missing-data">R�cup�rer des donn�es manquantes depuis l'Intranet</a></h2>

      

      <dl>
        <dt>Description :</dt>

        <dd>
          <p>C'est une m�thode astucieuse permettant de faire
	  fonctionner virtuellement un serveur web d'entreprise
	  (<code>www.quux-corp.dom</code>) sur
	  l'Internet (ext�rieur � l'entreprise), tout en maintenant et
	  conservant dans la r�alit� ses donn�es sur un serveur web
	  (<code>www2.quux-corp.dom</code>) de l'Intranet (interne �
	  l'entreprise) prot�g� par un pare-feu. L'astuce consiste, sur
	  le serveur web externe, � r�cup�rer � la vol�e sur le serveur interne
	  les donn�es demand�es.</p>
        </dd>

        <dt>Solution :</dt>

        <dd>
          <p>Tout d'abord, nous devons nous assurer que notre pare-feu
	  prot�ge bien le serveur web interne, et que seul le serveur
	  web externe est autoris� � y r�cup�rer des donn�es. Dans le
	  cas d'un filtrage par paquets, nous pourrions par exemple
	  d�finir un jeu de r�gles du pare-feu du style :</p>

<div class="example"><pre>
<strong>ALLOW</strong> serveur www.quux-corp.dom Port &gt;1024 --&gt;
serveur www2.quux-corp.dom Port <strong>80</strong>
<strong>DENY</strong>  serveur *                 Port *     --&gt;
serveur www2.quux-corp.dom Port <strong>80</strong>
</pre></div>

          <p>Il vous suffit d'adapter ces r�gles � la syntaxe de votre
	  pare-feu. Nous pouvons maintenant d�finir les r�gles de
	  <code class="module"><a href="/mod/mod_rewrite.html">mod_rewrite</a></code> qui serviront � r�cup�rer les
	  donn�es manquantes en arri�re-plan via la fonctionnalit� de
	  mandataire :</p>

<div class="example"><pre>
RewriteRule ^/~([^/]+)/?(.*)          /home/$1/.www/$2 [C]
# L'utilisation de REQUEST_FILENAME ci dessous est correcte dans cet
# exemple de contexte au niveau serveur car la r�gle qui fait r�f�rence
# � REQUEST_FILENAME est cha�n�e � une r�gle qui d�finit
# REQUEST_FILENAME.
RewriteCond %{REQUEST_FILENAME}       <strong>!-f</strong>
RewriteCond %{REQUEST_FILENAME}       <strong>!-d</strong>
RewriteRule ^/home/([^/]+)/.www/?(.*) http://<strong>www2</strong>.quux-corp.dom/~$1/pub/$2 [<strong>P</strong>]
</pre></div>
        </dd>
      </dl>

    </div><div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div>
<div class="section">
<h2><a name="load-balancing" id="load-balancing">R�partition de charge</a></h2>

      

      <dl>
        <dt>Description :</dt>

        <dd>
          <p>Supposons que nous voulions r�partir la charge du trafic
	  vers <code>www.example.com</code> entre les serveurs
	  <code>www[0-5].example.com</code> (un total de 6 serveurs).
	  Comment y parvenir ?</p>
        </dd>

        <dt>Solution :</dt>

        <dd>
          <p>Il existe de nombreuses solutions � ce probl�me. Nous
	  d�crirons tout d'abord une variante assez connue bas�e sur
	  DNS, puis une autre bas�e sur <code class="module"><a href="/mod/mod_rewrite.html">mod_rewrite</a></code>
	  :</p>

          <ol>
            <li>
              <strong>Round-Robin (tourniquet) DNS</strong>

              <p>La m�thode de r�partition de charge la plus simple
	      consiste � utiliser le "DNS round-robin"
	      (rotation d'adresses) de
	      <code>BIND</code>. Vous devez seulement enregistrer les
	      serveurs <code>www[0-9].example.com</code> de mani�re
	      habituelle dans votre DNS � l'aide d'enregistrements de
	      type A (adresse), comme suit :</p>

<div class="example"><pre>
www0   IN  A       1.2.3.1
www1   IN  A       1.2.3.2
www2   IN  A       1.2.3.3
www3   IN  A       1.2.3.4
www4   IN  A       1.2.3.5
www5   IN  A       1.2.3.6
</pre></div>

              <p>Puis vous ajoutez les entr�es suivantes :</p>

<div class="example"><pre>
www   IN  A       1.2.3.1
www   IN  A       1.2.3.2
www   IN  A       1.2.3.3
www   IN  A       1.2.3.4
www   IN  A       1.2.3.5
</pre></div>

              <p>Maintenant, lors de la r�solution de
	      <code>www.example.com</code>, <code>BIND</code> renvoie
	      <code>www0-www5</code> - mais selon une permutation
	      diff�rente � chaque fois. De cette fa�on, les clients sont
	      r�partis entre les diff�rents serveurs. Notez cependant
	      que cette m�thode de r�partition de charge n'est pas
	      parfaite, car les r�solutions DNS sont mises en cache par
	      les clients et les autres serveurs DNS du r�seau, si
	      bien que lorsqu'un client s'est vu r�soudre
	      <code>www.example.com</code> en un des
	      <code>wwwN.example.com</code>, toutes ses requ�tes ult�rieures
	      continueront d'aller vers la m�me adresse IP (et donc le
	      m�me serveur), au lieu d'�tre r�parties entre les autres
	      serveurs. Le r�sultat est cependant globalement
	      satisfaisant car les requ�tes sont r�parties
	      collectivement entre chacun des serveurs web.</p>
            </li>

            <li>
              <strong>R�partition de charge bas�e sur DNS</strong>

              <p>Une m�thode de r�partition de charge sophistiqu�e bas�e
	      sur DNS consiste � utiliser le programme
	      <code>lbnamed</code> que l'on peut trouver � <a href="http://www.stanford.edu/~riepel/lbnamed/">
              http://www.stanford.edu/~riepel/lbnamed/</a>.
	      Associ� � des outils auxiliaires, il s'agit d'un programme
	      en Perl 5 qui permet d'effectuer une v�ritable r�partition
	      de charge bas�e sur DNS.</p>
            </li>

            <li>
              <strong>Round-Robin bas� sur la fonctionnalit� de
	      mandataire</strong>

              <p>Dans cette variante, nous utilisons
	      <code class="module"><a href="/mod/mod_rewrite.html">mod_rewrite</a></code> et sa fonctionnalit� de
	      mandataire. Tout d'abord, nous d�finissons
	      <code>www0.example.com</code> comme un autre nom de
	      <code>www.example.com</code> en ajoutant l'entr�e</p>

<div class="example"><pre>
www    IN  CNAME   www0.example.com.
</pre></div>

              <p>dans le DNS. Puis nous d�finissons
	      <code>www0.example.com</code> comme serveur mandataire
	      seulement, c'est � dire que nous configurons cette machine
	      de telle sorte que toutes les URLs qui lui arrivent soient
	      simplement transmises, via le mandataire interne, vers un
	      des 5 autres serveurs (<code>www1-www5</code>). Pour y
	      parvenir, nous d�finissons tout d'abord un jeu de r�gles
	      qui contacte un script de r�partition de charge
	      <code>lb.pl</code> pour toutes les URLs.</p>

<div class="example"><pre>
RewriteEngine on
RewriteMap    lb      prg:/chemin/vers/lb.pl
RewriteRule   ^/(.+)$ ${lb:$1}           [P,L]
</pre></div>

              <p>Puis nous �crivons <code>lb.pl</code> :</p>

<div class="example"><pre>
#!/chemin/vers/perl
##
##  lb.pl -- script de r�partition de charge
##

$| = 1;

$name   = "www";     # la base du nom du serveur
$first  = 1;         # le premier serveur (pas 0 ici, car 0 correspond �
		     # moi-m�me)
$last   = 5;         # le dernier serveur du tourniquet
$domain = "foo.dom"; # le nom de domaine

$cnt = 0;
while (&lt;STDIN&gt;) {
    $cnt = (($cnt+1) % ($last+1-$first));
    $server = sprintf("%s%d.%s", $name, $cnt+$first, $domain);
    print "http://$server/$_";
}

##EOF##
</pre></div>

              <div class="note">Une derni�re remarque : � quoi cela sert-il ?
	      <code>www0.example.com</code>, quant � lui, n'est-il pas
	      toujours surcharg� ? La r�ponse est oui, il est surcharg�,
	      mais seulement avec des requ�tes de mandataire ! Tous les
	      traitements SSI, CGI, ePerl, etc... sont enti�rement
	      effectu�s sur les autres machines. Ceci peut fonctionner
	      correctement pour un site complexe. Le plus grand risque
	      r�side ici dans le fait que www0 est un passage oblig� et
	      que s'il est hors service, les autres serveurs deviennent
	      inaccessibles.</div>
            </li>

            <li>
              <strong>R�partiteur de charge d�di�</strong>

              <p>Il existe aussi des solutions plus sophistiqu�es.
	      Cisco, F5, et de nombreuses autres soci�t�s proposent
	      des r�partiteurs de charge mat�riels (utilis�s en g�n�ral
	      en mode doubl� � des fins de redondance), qui offrent une
	      r�partition de charge sophistiqu�e et des fonctionnalit�s
	      de passage automatique en mode de fonctionnement par d�faut
	      en cas de probl�me. Cependant, des solutions logicielles
	      offrent aussi des fonctionnalit�s similaires avec du
	      mat�riel standard. Si vos besoins correspondent et si vous
	      �tes assez riche, vous pouvez envisager ces solutions. La
	      <a href="http://vegan.net/lb/">liste de diffusion lb-l</a>
	      est un bon point de d�part pour vos recherches.</p>
            </li>
          </ol>
        </dd>
      </dl>

    </div><div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div>
<div class="section">
<h2><a name="new-mime-type" id="new-mime-type">Nouveau type MIME, nouveau service</a></h2>

      

      <dl>
        <dt>Description :</dt>

        <dd>
          <p>On trouve de nombreux programmes CGI attractifs sur le
	  r�seau. Mais leur emploi est souvent r�barbatif, si bien que
	  de nombreux webmasters ne les utilisent pas. M�me la
	  fonctionnalit� de gestionnaire Action d'Apache pour les types
	  MIME ne convient que lorsque les programmes CGI ne n�cessitent
	  pas d'URLs sp�ciales (r�ellement <code>PATH_INFO</code> et
	  <code>QUERY_STRINGS</code>) en entr�e. Tout d'abord,
	  d�finissons un nouveau type de fichier ayant pour extension
	  <code>.scgi</code> (pour CGI s�curis�) qui sera associ� pour
	  traitement au programme populaire <code>cgiwrap</code>. Le
	  probl�me est le suivant : par exemple, si on utilise un style
	  d'URL bien d�fini (voir ci-dessus), un fichier situ� dans le
	  r�pertoire home de l'utilisateur pourra correspondre � l'URL
	  <code>/u/user/foo/bar.scgi</code>. Mais <code>cgiwrap</code>
	  n�cessite des URLs de la forme
	  <code>/~user/foo/bar.scgi/</code>. La r�gle suivante apporte
	  la solution :</p>

<div class="example"><pre>
RewriteRule ^/[uge]/<strong>([^/]+)</strong>/\.www/(.+)\.scgi(.*) ...
... /interne/cgi/utilisateur/cgiwrap/~<strong>$1</strong>/$2.scgi$3  [NS,<strong>T=application/x-http-cgi</strong>]
</pre></div>

          <p>Ou consid�rons ces autres programmes attractifs :
	  <code>wwwlog</code> (qui affiche le journal des acc�s
	  <code>access.log</code> pour un sous r�pertoire correspondant
	  � une URL) et <code>wwwidx</code> (qui ex�cute Glimpse sur un
	  sous r�pertoire correspondant � une URL). Nous devons fournir
	  l'URL correspondante � ces programmes afin qu'ils sachent sur
	  quel r�pertoire ils doivent agir. Mais c'est en g�n�ral
	  compliqu�, car ils peuvent �tre appel�s � nouveau
	  par la forme d'URL alternative, c'est � dire que typiquement,
	  nous ex�cuterions le programme <code>swwidx</code> depuis
	  <code>/u/user/foo/</code> via un hyperlien vers</p>

<div class="example"><pre>
/internal/cgi/user/swwidx?i=/u/user/foo/
</pre></div>

          <p>ce qui n'est pas satisfaisant, car nous devons expliciter
	  <strong>� la fois</strong> la localisation du r�pertoire
	  <strong>et</strong> la localisation du programme CGI dans
	  l'hyperlien. Si nous devons nous r�organiser, il nous faudra
	  beaucoup de temps pour modifier tous les hyperliens.</p>
        </dd>

        <dt>Solution :</dt>

        <dd>
          <p>La solution consiste ici � fournir un nouveau format d'URL
	  qui redirige automatiquement vers la requ�te CGI appropri�e.
	  Pour cela, on d�finit les r�gles suivantes :</p>

<div class="example"><pre>
RewriteRule   ^/([uge])/([^/]+)(/?.*)/\*  /interne/cgi/utilisateur/wwwidx?i=/$1/$2$3/
RewriteRule   ^/([uge])/([^/]+)(/?.*):log /interne/cgi/utilisateur/wwwlog?f=/$1/$2$3
</pre></div>

          <p>Et maintenant l'hyperlien qui renvoie vers
	  <code>/u/user/foo/</code> se r�duit �</p>

<div class="example"><pre>
HREF="*"
</pre></div>

          <p>qui est automatiquement transform� en interne en</p>

<div class="example"><pre>
/internal/cgi/user/wwwidx?i=/u/user/foo/
</pre></div>

          <p>Une approche similaire permet d'invoquer le programme CGI
	  du journal des acc�s lorsque l'hyperlien <code>:log</code> est
	  utilis�.</p>
        </dd>
      </dl>

    </div><div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div>
<div class="section">
<h2><a name="on-the-fly-content" id="on-the-fly-content">R�g�neration de contenu � la vol�e</a></h2>

      

      <dl>
        <dt>Description :</dt>

        <dd>
          <p>Voici une fonctionnalit� vraiment �sot�rique : des pages
	  g�n�r�es dynamiquement mais servies statiquement, c'est �
	  dire que les pages doivent �tre servies comme des pages
	  purement statiques (lues depuis le syst�me de fichiers et
	  servies en l'�tat), mais doivent �tre g�n�r�es dynamiquement
	  par le serveur web si elles sont absentes. Ainsi, vous pouvez
	  avoir des pages g�n�r�es par CGI qui sont servies statiquement
	  � moins qu'un administrateur (ou une t�che de
	  <code>cron</code>) ne supprime les
	  contenus statiques. Les contenus sont ensuite actualis�s.</p>
        </dd>

        <dt>Solution :</dt>

        <dd>
          A cet effet, on utilise le jeu de r�gles suivant :

<div class="example"><pre>
# Cet exemple n'est valable que dans un contexte de r�pertoire
RewriteCond %{REQUEST_FILENAME}   <strong>!-s</strong>
RewriteRule ^page\.<strong>html</strong>$          page.<strong>cgi</strong>   [T=application/x-httpd-cgi,L]
</pre></div>

          <p>Ainsi, une requ�te pour <code>page.html</code> entra�ne
	  l'ex�cution interne de la page <code>page.cgi</code>
	  correspondante si <code>page.html</code> n'existe pas
	  ou poss�de une taille de fichier nulle. L'astuce r�side ici
	  dans le fait que <code>page.cgi</code> est un script CGI
	  qui (en plus de <code>STDOUT</code>) �crit sa sortie dans le
	  fichier <code>page.html</code>. Une fois le script ex�cut�, le
	  serveur sert la page <code>page.html</code> fra�chement
	  g�n�r�e. Si le webmaster
	  veut actualiser les contenus, il lui suffit de supprimer le
	  fichier <code>page.html</code> (le plus souvent via une t�che
	  de <code>cron</code>).</p>
        </dd>
      </dl>

    </div><div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div>
<div class="section">
<h2><a name="autorefresh" id="autorefresh">Actualisation automatique d'un document</a></h2>

      

      <dl>
        <dt>Description :</dt>

        <dd>
          <p>Lorsque nous cr�ons une page web complexe, ne serait-il pas
	  souhaitable que le navigateur web actualise automatiquement la
	  page chaque fois que nous en sauvegardons une nouvelle version
	  � partir de notre �diteur ? Impossible ?</p>
        </dd>

        <dt>Solution :</dt>

        <dd>
          <p>Non ! Nous allons pour cela combiner la fonctionnalit� MIME
	  multipart, la fonctionnalit� NPH du serveur web et la
	  puissance de <code class="module"><a href="/mod/mod_rewrite.html">mod_rewrite</a></code> pour la manipulation
	  d'URLs. Tout d'abord, nous d�finissons une nouvelle
	  fonctionnalit� pour les URLs : l'ajout de
	  <code>:refresh</code> � toute URL fait que la 'page' est
	  actualis�e chaque fois que la ressource est mise � jour dans
	  le syst�me de fichiers.</p>

<div class="example"><pre>
RewriteRule   ^(/[uge]/[^/]+/?.*):refresh  /interne/cgi/apache/nph-refresh?f=$1
</pre></div>

          <p>Nous appelons maintenant cette URL</p>

<div class="example"><pre>
/u/foo/bar/page.html:refresh
</pre></div>

          <p>ce qui entra�ne en interne l'invocation de l'URL</p>

<div class="example"><pre>
/interne/cgi/apache/nph-refresh?f=/u/foo/bar/page.html
</pre></div>

          <p>Il ne reste plus qu'� �crire le script CGI. Bien que l'on
	  �crive habituellement dans ces cas "laiss� � la charge du
	  lecteur � titre d'exercice", ;-) je vous l'offre, aussi.</p>

<div class="example"><pre>
#!/sw/bin/perl
##
##  nph-refresh -- script NPH/CGI pour l'actualisation automatique de
##  pages
##  Copyright (c) 1997 Ralf S. Engelschall, All Rights Reserved.
##
$| = 1;

#   �clate la variable QUERY_STRING
@pairs = split(/&amp;/, $ENV{'QUERY_STRING'});
foreach $pair (@pairs) {
    ($name, $value) = split(/=/, $pair);
    $name =~ tr/A-Z/a-z/;
    $name = 'QS_' . $name;
    $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
    eval "\$$name = \"$value\"";
}
$QS_s = 1 if ($QS_s eq '');
$QS_n = 3600 if ($QS_n eq '');
if ($QS_f eq '') {
    print "HTTP/1.0 200 OK\n";
    print "Content-type: text/html\n\n";
    print "&amp;lt;b&amp;gt;ERREUR&amp;lt;/b&amp;gt;: Aucun fichier fourni\n";
    exit(0);
}
if (! -f $QS_f) {
    print "HTTP/1.0 200 OK\n";
    print "Content-type: text/html\n\n";
    print "&amp;lt;b&amp;gt;ERREUR&amp;lt;/b&amp;gt;: Fichier $QS_f non trouv�\n";
    exit(0);
}

sub print_http_headers_multipart_begin {
    print "HTTP/1.0 200 OK\n";
    $bound = "ThisRandomString12345";
    print "Content-type: multipart/x-mixed-replace;boundary=$bound\n";
    &amp;print_http_headers_multipart_next;
}

sub print_http_headers_multipart_next {
    print "\n--$bound\n";
}

sub print_http_headers_multipart_end {
    print "\n--$bound--\n";
}

sub displayhtml {
    local($buffer) = @_;
    $len = length($buffer);
    print "Content-type: text/html\n";
    print "Content-length: $len\n\n";
    print $buffer;
}

sub readfile {
    local($file) = @_;
    local(*FP, $size, $buffer, $bytes);
    ($x, $x, $x, $x, $x, $x, $x, $size) = stat($file);
    $size = sprintf("%d", $size);
    open(FP, "&amp;lt;$file");
    $bytes = sysread(FP, $buffer, $size);
    close(FP);
    return $buffer;
}

$buffer = &amp;readfile($QS_f);
&amp;print_http_headers_multipart_begin;
&amp;displayhtml($buffer);

sub mystat {
    local($file) = $_[0];
    local($time);

    ($x, $x, $x, $x, $x, $x, $x, $x, $x, $mtime) = stat($file);
    return $mtime;
}

$mtimeL = &amp;mystat($QS_f);
$mtime = $mtime;
for ($n = 0; $n &amp;lt; $QS_n; $n++) {
    while (1) {
        $mtime = &amp;mystat($QS_f);
        if ($mtime ne $mtimeL) {
            $mtimeL = $mtime;
            sleep(2);
            $buffer = &amp;readfile($QS_f);
            &amp;print_http_headers_multipart_next;
            &amp;displayhtml($buffer);
            sleep(5);
            $mtimeL = &amp;mystat($QS_f);
            last;
        }
        sleep($QS_s);
    }
}

&amp;print_http_headers_multipart_end;

exit(0);

##EOF##
</pre></div>
        </dd>
      </dl>

    </div><div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div>
<div class="section">
<h2><a name="mass-virtual-hosting" id="mass-virtual-hosting">H�bergement virtuel de masse</a></h2>

      

      <dl>
        <dt>Description :</dt>

        <dd>
          <p>La fonctionnalit� <code class="directive"><a href="/mod/core.html#virtualhost">&lt;VirtualHost&gt;</a></code> d'Apache est int�ressante et
	  fonctionne de mani�re satisfaisante jusqu'� quelques
	  douzaines de serveurs virtuels. Par contre, si vous �tes un
	  FAI et devez h�berger des centaines de serveurs virtuels,
	  cette m�thode n'est pas optimale.</p>
        </dd>

        <dt>Solution :</dt>

        <dd>
          <p>Pour fournir cette fonctionnalit� avec
	  <code class="module"><a href="/mod/mod_rewrite.html">mod_rewrite</a></code>, on fait correspondre � notre espace de
	  nommage la page web ou m�me le r�pertoire complet distants en
	  utilisant la fonctionnalit� <dfn>Mandataire</dfn>
	  (drapeau <code>[P]</code>) :</p>

<div class="example"><pre>
##
##  vhost.map
##
www.vhost1.dom:80  /chemin/vers/racine-doc/vhost1
www.vhost2.dom:80  /chemin/vers/racine-doc/vhost2
     :
www.vhostN.dom:80  /chemin/vers/racine-doc/vhostN
</pre></div>

<div class="example"><pre>
##
##  httpd.conf
##
    :
#   utilisation du nom d'h�te canonique pour les redirections, etc...
UseCanonicalName on

    :
#   ajout du serveur virtuel en t�te du format CLF
CustomLog  /chemin/vers/access_log  "%{VHOST}e %h %l %u %t \"%r\" %&gt;s %b"
    :

#   activation du moteur de r��criture pour le serveur principal
RewriteEngine on

#   d�finition de deux tables de correspondances : une premi�re pour
#   corriger les URLs et une seconde qui associe les serveurs virtuels
#   disponibles avec leurs racines des documents correspondantes.
RewriteMap    lowercase    int:tolower
RewriteMap    vhost        txt:/chemin/vers/vhost.map

#   et enfin s�lection proprement dite du serveur virtuel appropri� via
#   une seule r�gle longue et complexe :
#
#   1. on s'assure de ne pas s�lectionner un h�te virtuel pour les
#   adresses communes

RewriteCond   %{REQUEST_URI}  !^/adresse-commune1/.*
RewriteCond   %{REQUEST_URI}  !^/adresse-commune2/.*
    :
RewriteCond   %{REQUEST_URI}  !^/adresse-communeN/.*
#
#   2. on v�rifie que l'on dispose bien d'un en-t�te Host, car
#   actuellement, cette m�thode ne peut faire de l'h�bergement virtuel
#   qu'avec cet en-t�te
RewriteCond   %{HTTP_HOST}  !^$
#
#   3. mise en minuscules du nom d'h�te
RewriteCond   ${lowercase:%{HTTP_HOST}|NONE}  ^(.+)$
#
#   4. recherche ce ce nom d'h�te dans vhost.map et
#      enregistrement de celui-ci seulement s'il s'agit d'un chemin
#      (et non "NONE" en provenance de la condition pr�c�dente)
RewriteCond   ${vhost:%1}  ^(/.*)$
#
#   5. nous pouvons enfin faire correspondre l'URL avec la racine des
#   documents correspondant au serveur virtuel appropri� et enregistrer
#   ce dernier � des fins de journalisation
RewriteRule   ^/(.*)$   %1/$1  [E=VHOST:${lowercase:%{HTTP_HOST}}]
    :
</pre></div>
        </dd>
      </dl>

    </div><div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div>
<div class="section">
<h2><a name="host-deny" id="host-deny">Interdiction d'h�tes</a></h2>

      

      <dl>
        <dt>Description :</dt>

        <dd>
          <p>Comment interdire l'acc�s � notre serveur � une liste
	  d'h�tes ?</p>
        </dd>

        <dt>Solution :</dt>

        <dd>
          <p>Pour Apache &gt;= 1.3b6 :</p>

<div class="example"><pre>
RewriteEngine on
RewriteMap    h�tes-interdits  txt:/chemin/vers/h�tes-interdits
RewriteCond   ${h�tes-interdits:%{REMOTE_HOST}|NOT-FOUND} !=NOT-FOUND [OR]
RewriteCond   ${h�tes-interdits:%{REMOTE_ADDR}|NOT-FOUND} !=NOT-FOUND
RewriteRule   ^/.*  -  [F]
</pre></div>

          <p>Pour Apache &lt;= 1.3b6 :</p>

<div class="example"><pre>
RewriteEngine on
RewriteMap    h�tes-interdits  txt:/chemin/vers/h�tes-interdits
RewriteRule   ^/(.*)$ ${h�tes-interdits:%{REMOTE_HOST}|NOT-FOUND}/$1
RewriteRule   !^NOT-FOUND/.* - [F]
RewriteRule   ^NOT-FOUND/(.*)$ ${h�tes-interdits:%{REMOTE_ADDR}|NOT-FOUND}/$1
RewriteRule   !^NOT-FOUND/.* - [F]
RewriteRule   ^NOT-FOUND/(.*)$ /$1
</pre></div>

<div class="example"><pre>
##
##  hosts.deny
##
##  ATTENTION! Ceci est une table de correspondances, pas une liste,
##  m�me si on l'utilise en tant que telle. mod_rewrite l'interpr�te
##  comme un ensemble de paires cl�/valeur ; chaque entr�e doit donc
##  au moins poss�der une valeur fictive "-".
##

193.102.180.41 -
bsdti1.sdm.de  -
192.76.162.40  -
</pre></div>
        </dd>
      </dl>

    </div><div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div>
<div class="section">
<h2><a name="proxy-deny" id="proxy-deny">Interdiction du mandataire</a></h2>

      

      <dl>
        <dt>Description :</dt>

        <dd>
          <p>Comment interdire l'utilisation du mandataire d'Apache pour
	  un certain h�te, ou m�me seulement pour un utilisateur
	  de cet h�te ?</p>
        </dd>

        <dt>Solution :</dt>

        <dd>
          <p>Nous devons tout d'abord nous assurer que
	  <code class="module"><a href="/mod/mod_rewrite.html">mod_rewrite</a></code> arrive apr�s(!)
	  <code class="module"><a href="/mod/mod_proxy.html">mod_proxy</a></code> dans le fichier de configuration
	  lors de la compilation du serveur web Apache. De cette fa�on,
	  il est appel� <em>avant</em> <code class="module"><a href="/mod/mod_proxy.html">mod_proxy</a></code>. Nous
	  pouvons ensuite d�finir cette r�gle pour une interdiction
	  d�pendant de l'h�te :</p>

<div class="example"><pre>
RewriteCond %{REMOTE_HOST} <strong>^h�te-�-rejeter\.mon-domaine\.com$</strong>
RewriteRule !^http://[^/.]\.mon-domaine.com.*  - [F]
</pre></div>

          <p>...et celle-ci pour une interdiction d�pendant de
	  utilisateur@h�te :</p>

<div class="example"><pre>
RewriteCond %{REMOTE_IDENT}@%{REMOTE_HOST}  <strong>^utilisateur-�-
rejeter@h�te-�-rejeter\.mon-domaine\.com$</strong>
RewriteRule !^http://[^/.]\.mon-domaine.com.*  - [F]
</pre></div>
        </dd>
      </dl>

    </div><div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div>
<div class="section">
<h2><a name="special-authentication" id="special-authentication">Variante particuli�re d'authentification</a></h2>

      

      <dl>
        <dt>Description :</dt>

        <dd>
          <p>On a parfois besoin d'une authentification tr�s
	  particuli�re, par exemple une authentification qui v�rifie la
	  pr�sence d'un utilisateur dans une liste explicitement
	  d�finie. Seuls ceux qui sont pr�sents dans la liste se voient
	  accorder un acc�s, et ceci sans avoir �
	  s'identifier/authentifier (comme c'est le cas avec une
	  authentification de base via <code class="module"><a href="/mod/mod_auth.html">mod_auth</a></code>).</p>
        </dd>

        <dt>Solution :</dt>

        <dd>
          <p>On d�finit une liste de conditions de r��criture pour
	  interdire l'acc�s � tout le monde, sauf aux utilisateurs
	  autoris�s :</p>

<div class="example"><pre>
RewriteCond %{REMOTE_IDENT}@%{REMOTE_HOST} <strong>!^ami1@client1.quux-corp\.com$</strong>
RewriteCond %{REMOTE_IDENT}@%{REMOTE_HOST} <strong>!^ami2</strong>@client2.quux-corp\.com$
RewriteCond %{REMOTE_IDENT}@%{REMOTE_HOST} <strong>!^ami3</strong>@client3.quux-corp\.com$
RewriteRule ^/~quux/seulement-pour-les-amis/      -                                 [F]
</pre></div>
        </dd>
      </dl>

    </div><div class="top"><a href="#page-header"><img alt="top" src="/images/up.gif" /></a></div>
<div class="section">
<h2><a name="referer-deflector" id="referer-deflector">Redirection bas�e sur le r�f�rent</a></h2>

      

      <dl>
        <dt>Description :</dt>

        <dd>
          <p>Comment �crire un programme souple qui redirige certaines
	  URLs en se basant sur l'en-t�te HTTP "Referer", et peut �tre
	  configur� avec autant de pages de r�f�rence
	  que l'on veut ?</p>
        </dd>

        <dt>Solution :</dt>

        <dd>
          <p>On utilise le jeu de r�gles vraiment astucieux suivant :</p>

<div class="example"><pre>
RewriteMap  deflector txt:/chemin/vers/deflector.map

RewriteCond %{HTTP_REFERER} !=""
RewriteCond ${deflector:%{HTTP_REFERER}} ^-$
RewriteRule ^.* %{HTTP_REFERER} [R,L]

RewriteCond %{HTTP_REFERER} !=""
RewriteCond ${deflector:%{HTTP_REFERER}|NOT-FOUND} !=NOT-FOUND
RewriteRule ^.* ${deflector:%{HTTP_REFERER}} [R,L]
</pre></div>

          <p>... en association avec la table de r��criture
	  correspondante :</p>

<div class="example"><pre>
##
##  deflector.map
##

http://www.mauvais-sujets.com/mauvais/index.html    -
http://www.mauvais-sujets.com/mauvais/index2.html   -
http://www.mauvais-sujets.com/mauvais/index3.html   http://quelque-part.com/
</pre></div>

          <p>Les requ�tes sont redirig�es vers la page de r�f�rence
	  (lorsque la valeur correspondant � la cl� extraite de la table
	  de correspondances est �gale � "<code>-</code>"), ou vers une
	  URL sp�cifique (lorsqu'une URL est d�finie dans la table de
	  correspondances comme second argument).</p>
        </dd>
      </dl>

    </div></div>
<div class="bottomlang">
<p><span>Langues Disponibles: </span></p>
</div><div id="footer">
<p class="apache">Copyright 2010 The Apache Software Foundation.<br />Autoris� sous <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.</p>
<p class="menu"><a href="/mod/">Modules</a> | <a href="/mod/directives.html">Directives</a> | <a href="/faq/">FAQ</a> | <a href="/glossary.html">Glossaire</a> | <a href="/sitemap.html">Plan du site</a></p></div>
</body></html>