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="<-" alt="<-" src="/images/left.gif" /></a></div>
<div id="path">
<a href="http://www.apache.org/">Apache</a> > <a href="http://httpd.apache.org/">Serveur HTTP</a> > <a href="http://httpd.apache.org/docs/">Documentation</a> > <a href="/">Version 2.3</a> > <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 >1024 -->
serveur www2.quux-corp.dom Port <strong>80</strong>
<strong>DENY</strong> serveur * Port * -->
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 (<STDIN>) {
$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(/&/, $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 "&lt;b&gt;ERREUR&lt;/b&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 "&lt;b&gt;ERREUR&lt;/b&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";
&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, "&lt;$file");
$bytes = sysread(FP, $buffer, $size);
close(FP);
return $buffer;
}
$buffer = &readfile($QS_f);
&print_http_headers_multipart_begin;
&displayhtml($buffer);
sub mystat {
local($file) = $_[0];
local($time);
($x, $x, $x, $x, $x, $x, $x, $x, $x, $mtime) = stat($file);
return $mtime;
}
$mtimeL = &mystat($QS_f);
$mtime = $mtime;
for ($n = 0; $n &lt; $QS_n; $n++) {
while (1) {
$mtime = &mystat($QS_f);
if ($mtime ne $mtimeL) {
$mtimeL = $mtime;
sleep(2);
$buffer = &readfile($QS_f);
&print_http_headers_multipart_next;
&displayhtml($buffer);
sleep(5);
$mtimeL = &mystat($QS_f);
last;
}
sleep($QS_s);
}
}
&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"><VirtualHost></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\" %>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 >= 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 <= 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>
|