{"id":2307,"date":"2023-01-08T18:38:11","date_gmt":"2023-01-08T17:38:11","guid":{"rendered":"https:\/\/www.webodesign.net\/?p=2307"},"modified":"2023-01-10T08:45:46","modified_gmt":"2023-01-10T07:45:46","slug":"3-conteneurs-apache-htaccess-et-equivalents-nginx","status":"publish","type":"post","link":"https:\/\/www.webodesign.net\/?p=2307","title":{"rendered":"3. Conteneurs Apache, .htaccess et \u00e9quivalents Nginx"},"content":{"rendered":"\n<div class=\"wp-block-uagb-container uagb-block-38cb8539 alignfull uagb-is-root-container\"><div class=\"uagb-container-inner-blocks-wrap\">\n<div class=\"wp-block-columns is-layout-flex wp-container-10\">\n<div class=\"wp-block-column is-layout-flow\">\n<div class=\"wp-block-group is-layout-flow\">\n<div class=\"wp-block-group is-layout-flow\" style=\"border-style:none;border-width:0px;border-radius:0px\">\t\t\t\t<div class=\"wp-block-uagb-table-of-contents uagb-toc__align-left uagb-toc__columns-1  uagb-block-f7ca9459     \"\n\t\t\t\t\tdata-scroll= \"1\"\n\t\t\t\t\tdata-offset= \"30\"\n\t\t\t\t\tstyle=\"\"\n\t\t\t\t>\n\t\t\t\t<div class=\"uagb-toc__wrap\">\n\t\t\t\t\t\t<div class=\"uagb-toc__title\">\n\t\t\t\t\t\t\tSommaire\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"uagb-toc__list-wrap\">\n\t\t\t\t\t\t<ol class=\"uagb-toc__list\"><li class=\"uagb-toc__list\"><a href=\"#31-les-directives-r\u00e9pertoire\" class=\"uagb-toc-link__trigger\">3.1. .Les directives r\u00e9pertoire<\/a><ul class=\"uagb-toc__list\"><li class=\"uagb-toc__list\"><a href=\"#311-le-conteneur-directory\" class=\"uagb-toc-link__trigger\">3.1.1. Le conteneur Directory<\/a><li class=\"uagb-toc__list\"><li class=\"uagb-toc__list\"><a href=\"#312-le-conteneur-directorymatch\" class=\"uagb-toc-link__trigger\">3.1.2. Le conteneur DirectoryMatch<\/a><li class=\"uagb-toc__list\"><li class=\"uagb-toc__list\"><a href=\"#313-les-conteneurs-files-et-filesmatch\" class=\"uagb-toc-link__trigger\">3.1.3. Les conteneurs Files et FilesMatch<\/a><li class=\"uagb-toc__list\"><li class=\"uagb-toc__list\"><a href=\"#314-les-conteneurs-location-et-locationmatch\" class=\"uagb-toc-link__trigger\">3.1.4. Les conteneurs Location et LocationMatch<\/a><li class=\"uagb-toc__list\"><li class=\"uagb-toc__list\"><a href=\"#315-le-conteneur-if\" class=\"uagb-toc-link__trigger\">3.1.5. Le conteneur If<\/a><\/li><\/ul><\/li><li class=\"uagb-toc__list\"><a href=\"#32-le-fichier-htaccess\" class=\"uagb-toc-link__trigger\">3.2. Le fichier .htaccess<\/a><li class=\"uagb-toc__list\"><a href=\"#34-diff\u00e9rences-et-comparaison-des-contextes-et-directives-apache-et-nginx\" class=\"uagb-toc-link__trigger\">3.4. Diff\u00e9rences et comparaison des contextes et directives Apache et Nginx<\/a><ul class=\"uagb-toc__list\"><li class=\"uagb-toc__list\"><a href=\"#331-apache\" class=\"uagb-toc-link__trigger\">3.3.1. Apache<\/a><li class=\"uagb-toc__list\"><li class=\"uagb-toc__list\"><a href=\"#331-nginx\" class=\"uagb-toc-link__trigger\">3.3.1. Nginx<\/a><\/li><\/ul><\/li><\/ul><\/li><li class=\"uagb-toc__list\"><a href=\"#34-les-conteneurs-limit-et-limitexcept\" class=\"uagb-toc-link__trigger\">3.4. Les conteneurs Limit et LimitExcept<\/a><\/ul><\/ul><\/ol>\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t<\/div>\n\n\n\n<h1 class=\"has-text-color wp-block-heading\" id=\"1-i-pr%C3%A9sentation\" style=\"color:#fffdf8;margin-top:0;margin-right:0;margin-bottom:0;margin-left:0;padding-top:0;padding-right:0;padding-bottom:0;padding-left:0;font-size:1px\">3. Conteneurs Apache, .htaccess et \u00e9quivalents Nginx<\/h1>\n\n\n\n<div class=\"wp-block-group has-border-color has-vivid-cyan-blue-border-color has-background is-layout-flow\" style=\"border-style:dotted;border-width:2px;border-radius:8px;background-color:#fffdf8;padding-right:7px;padding-bottom:15px;padding-left:7px\">\n<p><em>On rappelle que les directives d\u2019Apache, permettant de configurer ce serveur, peuvent \u00eatre d\u00e9clar\u00e9es dans 4 contextes diff\u00e9rents&nbsp;: de configuration globale, h\u00f4te virtuel, r\u00e9pertoire et .htaccess.<\/em><\/p>\n\n\n\n<p><em>Un index des directives expliquant le d\u00e9tail de leur fonctionnement, ainsi qu\u2019une liste des nombreux modules existants sont disponibles sur le site<\/em> <a href=\"http:\/\/httpd.apache.org\/docs\">http:\/\/httpd.apache.org\/docs<\/a><em>.<\/em><\/p>\n\n\n\n<p><em>Pour Nginx, la documentation se trouve sur<\/em> <a href=\"http:\/\/nginx.org\/en\/docs\/\">http:\/\/nginx.org\/en\/docs\/<\/a><em>.<\/em><\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-group has-border-color has-vivid-cyan-blue-border-color has-background is-layout-flow\" style=\"border-style:dotted;border-width:2px;border-radius:8px;background-color:#fffdf8;padding-right:7px;padding-bottom:15px;padding-left:7px\">\n<h2 class=\"has-text-color wp-block-heading\" id=\"1-i-pr%C3%A9sentation\" style=\"color:#fffdf8;margin-top:0;margin-right:0;margin-bottom:0;margin-left:0;padding-top:0;padding-right:0;padding-bottom:0;padding-left:0;font-size:1px\">3.1. .Les directives r\u00e9pertoire<\/h2>\n\n\n\n<div class=\"qubely-block-accordion  qubely-block-d34844\" data-item-toggle=\"true\">\n<div class=\"wp-block-qubely-accordion-item qubely-block-5aa91a\"><div class=\"qubely-accordion-item qubely-type-fill qubely-accordion-active\"><div class=\"qubely-accordion-panel qubely-icon-position-right\"><span class=\"qubely-accordion-panel-handler\" role=\"button\"><span class=\"qubely-accordion-panel-handler-label\">3.1. Les directives r\u00e9pertoire<\/span><span class=\"qubely-accordion-icon fa fa-plus\"><\/span><\/span><\/div><div class=\"qubely-accordion-body\" style=\"display:block\"><div itemprop=\"text\">\n<div class=\"wp-block-uagb-advanced-heading uagb-block-30d9d7e0\"><h3 class=\"uagb-heading-text\">3.1.1. Le conteneur <code>Directory<\/code><\/h3><\/div>\n\n\n\n<p>Le conteneur <code>&lt;Directory&gt;<\/code> contient des directives qui s\u2019appliquent \u00e0 un r\u00e9pertoire ainsi qu\u2019\u00e0 ses sous-r\u00e9pertoires et aux fichiers situ\u00e9s dans ces sous-r\u00e9pertoires. Ce r\u00e9pertoire doit \u00eatre d\u00e9sign\u00e9 par son <em>chemin absolu<\/em>, \u00e9ventuellement en utilisant le caract\u00e8re \u00ab&nbsp;*&nbsp;\u00bb, d\u00e9signant une suite quelconque de caract\u00e8res et d\u2019autres caract\u00e8res du <em>globbing<\/em><a href=\"https:\/\/luc.frama.io\/cours-asrall\/serveurs_web\/3_conteneurs.html#fn1\"><sup>1<\/sup><\/a>&nbsp;: \u00ab&nbsp;?&nbsp;\u00bb et les intervalles de caract\u00e8res \u00ab&nbsp;[a-z]&nbsp;\u00bb.<\/p>\n\n\n\n<p>Voici un exemple de d\u00e9finition&nbsp;:<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;htmlmixed&quot;,&quot;mime&quot;:&quot;text\/html&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;languageLabel&quot;:&quot;no&quot;,&quot;language&quot;:&quot;HTML&quot;,&quot;modeName&quot;:&quot;html&quot;}\">&lt;Directory \/var\/www\/*\/public_html&gt;\n    Options Indexes\n&lt;\/Directory&gt;<\/pre><\/div>\n\n\n\n<p>Le chemin <code>\/var\/www\/*\/public_html<\/code> cible les dossiers nomm\u00e9s <code>public_html<\/code> appartenant aux r\u00e9pertoires pr\u00e9sents dans le r\u00e9pertoire <code>\/var\/www\/<\/code>&nbsp;: <code>\/var\/www\/foo\/public_html\/<\/code>, mais pas <code>\/var\/www\/bar\/baz\/public_html\/<\/code>, par exemple.<\/p>\n\n\n\n<p><strong>Lorsque plusieurs d\u00e9finitions de conteneurs <code>&lt;Directory&gt;<\/code> peuvent s\u2019appliquer \u00e0 un r\u00e9pertoire donn\u00e9, ces d\u00e9finitions sont \u00e9valu\u00e9es de celle ayant la port\u00e9e la plus large \u00e0 celle ayant la port\u00e9e la plus r\u00e9duite, c\u2019est \u00e0 dire que la d\u00e9finition la plus sp\u00e9cifique surchargera la moins sp\u00e9cifique.<\/strong> Les diff\u00e9rentes directives contenues dans ces conteneurs peuvent donc se cumuler, voire \u00eatre surcharg\u00e9es au fil des conteneurs.<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;htmlmixed&quot;,&quot;mime&quot;:&quot;text\/html&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;languageLabel&quot;:&quot;no&quot;,&quot;language&quot;:&quot;HTML&quot;,&quot;modeName&quot;:&quot;html&quot;}\">&lt;Directory \/var\/www\/html\/&gt;\n    # D\u00e9finition plus sp\u00e9cifique\n&lt;\/Directory&gt;\n&lt;Directory \/var\/www\/&gt;\n    # D\u00e9finition large\n&lt;\/Directory&gt;<\/pre><\/div>\n\n\n\n<p>Dans cet exemple, lors d\u2019une requ\u00eate qui ira chercher le fichier <code>\/var\/www\/html\/index.html<\/code>, bien que la d\u00e9finition plus large <code>\/var\/www\/<\/code> soit en deuxi\u00e8me position, celle-ci sera \u00e9valu\u00e9e en premier, puis ce sera au tour de <code>\/var\/www\/html\/<\/code>.<\/p>\n\n\n\n<p>Si le caract\u00e8re g\u00e9n\u00e9rique \u00ab&nbsp;*&nbsp;\u00bb n\u2019est pas assez sophistiqu\u00e9 pour d\u00e9signer en une seule expression une liste de r\u00e9pertoire, il est \u00e9galement possible d\u2019utiliser des expressions r\u00e9guli\u00e8res<a href=\"https:\/\/luc.frama.io\/cours-asrall\/serveurs_web\/3_conteneurs.html#fn2\"><sup>2<\/sup><\/a> pour d\u00e9crire les noms de r\u00e9pertoires concern\u00e9s. La syntaxe de la premi\u00e8re ligne devient alors&nbsp;: <code>&lt;Directory ~ &quot;regex&quot;&gt;<\/code>. L\u2019utilisation de cette syntaxe est possible, mais on lui pr\u00e9f\u00e8re en pratique l\u2019utilisation de la directive qui est con\u00e7ue sp\u00e9cialement pour cet usage.<\/p>\n\n\n\n<div class=\"wp-block-uagb-advanced-heading uagb-block-4272cfc1\"><h3 class=\"uagb-heading-text\">3.1.2. Le conteneur <code>DirectoryMatch<\/code><\/h3><\/div>\n\n\n\n<p>Ce type de conteneur fonctionne exactement comme le conteneur <code>&lt;Directory ~ &quot;chemin&quot;&gt;<\/code> et demande donc une expression r\u00e9guli\u00e8re comme param\u00e8tre d\u00e9crivant les r\u00e9pertoires concern\u00e9s. Les principaux caract\u00e8res permettant de d\u00e9crire ces expressions r\u00e9guli\u00e8res sont d\u00e9crits ci-dessous&nbsp;:<\/p>\n\n\n\n<ul>\n<li><code>*<\/code>&nbsp;: r\u00e9p\u00e8te de 0 \u00e0 <em>n<\/em> fois le motif pr\u00e9c\u00e9dent ce caract\u00e8re&nbsp;;<\/li>\n\n\n\n<li><code>+<\/code>&nbsp;: r\u00e9p\u00e8te de 1 \u00e0 <em>n<\/em> fois le motif pr\u00e9c\u00e9dent ce caract\u00e8re&nbsp;;<\/li>\n\n\n\n<li><code>?<\/code>&nbsp;: rend facultatif le motif pr\u00e9c\u00e9dent ce caract\u00e8re (on parle aussi de r\u00e9p\u00e9tition de 0 \u00e0 1 fois)&nbsp;;<\/li>\n\n\n\n<li><code>{n}<\/code>&nbsp;: r\u00e9p\u00e8te exactement <em>n<\/em> fois le motif pr\u00e9c\u00e9dent&nbsp;;<\/li>\n\n\n\n<li><code>^<\/code>&nbsp;: d\u00e9signe le d\u00e9but d\u2019un chemin&nbsp;;<\/li>\n\n\n\n<li><code>$<\/code>&nbsp;: d\u00e9signe la fin d\u2019un chemin&nbsp;;<\/li>\n\n\n\n<li><code>[abc]<\/code>&nbsp;: exprime un choix \u00e0 faire parmi les caract\u00e8res <code>a<\/code>, <code>b<\/code> ou <code>c<\/code>&nbsp;;<\/li>\n\n\n\n<li><code>[a-z]<\/code>&nbsp;: exprime un choix \u00e0 faire parmi les minuscules&nbsp;;<\/li>\n\n\n\n<li><code>[a-zA-Z0-9]<\/code>&nbsp;: exprime un choix \u00e0 faire parmi les caract\u00e8res alphanum\u00e9riques&nbsp;;<\/li>\n\n\n\n<li><code>[^def]<\/code>&nbsp;: tous les caract\u00e8res sauf les caract\u00e8res <code>d<\/code>, <code>e<\/code> et <code>f<\/code>&nbsp;;<\/li>\n\n\n\n<li><code>.<\/code>&nbsp;: correspond \u00e0 n\u2019importe quel caract\u00e8re&nbsp;;<\/li>\n\n\n\n<li><code>\\.<\/code>&nbsp;: correspond au caract\u00e8re \u00ab&nbsp;.&nbsp;\u00bb.<\/li>\n<\/ul>\n\n\n\n<p>Ainsi les exemples suivants correspondent \u00e0&nbsp;:<\/p>\n\n\n\n<ul>\n<li><code>&quot;users&quot;<\/code>&nbsp;: tous les chemins et fichiers qui contiennent la cha\u00eene <code>users<\/code> (par ex&nbsp;: <code>\/var\/www\/truc\/users<\/code>, <code>\/var\/www\/ihateusers<\/code>, <code>\/var\/www\/usersarenotadmin<\/code>, <code>\/home\/user\/truc<\/code>)&nbsp;;<\/li>\n\n\n\n<li><code>&quot;^\/users&quot;<\/code>&nbsp;: tous les chemins commen\u00e7ant par <code>\/users<\/code>&nbsp;;<\/li>\n\n\n\n<li><code>users[0-9]{4}<\/code>&nbsp;: tous les chemins contenant la cha\u00eene <code>users<\/code> suivie de 4 chiffres.<\/li>\n<\/ul>\n\n\n\n<p>Les directives des conteneurs <code>&lt;DirectoryMatch&gt;<\/code> et <code>&lt;Directory ~&gt;<\/code> sont appliqu\u00e9es apr\u00e8s celles des conteneurs <code>&lt;Directory&gt;<\/code> et celles des fichiers <code>.htaccess<\/code>.<\/p>\n\n\n\n<p><strong>NB<\/strong>&nbsp;: il n\u2019est pas possible d\u2019utiliser les conteneurs <code>&lt;Directory&gt;<\/code> et <code>&lt;DirectoryMatch&gt;<\/code> dans un <code>.htaccess<\/code>.<\/p>\n\n\n\n<div class=\"wp-block-uagb-advanced-heading uagb-block-bf6a732a\"><h3 class=\"uagb-heading-text\">3.1.3. Les conteneurs <code>Files<\/code> et <code>FilesMatch<\/code><\/h3><\/div>\n\n\n\n<p>Ce type de conteneur fonctionne comme les conteneurs <code>&lt;Directory&gt;<\/code>, mais s\u2019applique cette fois uniquement \u00e0 des fichiers. Les noms des r\u00e9pertoires contenant ces fichiers ne sont pas consid\u00e9r\u00e9s dans le param\u00e8tre fourni au conteneur <code>&lt;Files&gt;<\/code>.<\/p>\n\n\n\n<p>Un exemple s\u2019appliquant \u00e0 tous les fichiers XML&nbsp;:<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;htmlmixed&quot;,&quot;mime&quot;:&quot;text\/html&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:false,&quot;language&quot;:&quot;HTML&quot;,&quot;modeName&quot;:&quot;html&quot;}\">&lt;Files *.xml&gt;\n    \u2026\n&lt;\/Files&gt;<\/pre><\/div>\n\n\n\n<p>Tout comme pour <code>&lt;Directory&gt;<\/code>, on peut utiliser une expression r\u00e9guli\u00e8re en ajoutant le caract\u00e8re <code>~<\/code>&nbsp;: <code>&lt;Files ~ &quot;\\.(gif|jpe?g|png)$&quot;&gt;<\/code>.<\/p>\n\n\n\n<p>La variante <code>&lt;FilesMatch&gt;<\/code> fonctionne exactement comme le conteneur <code>&lt;Files ~&gt;<\/code>, \u00e0 l\u2019instar de <code>&lt;DirectoryMatch&gt;<\/code> pour <code>&lt;Directory&gt;<\/code>.<\/p>\n\n\n\n<p>Les fichiers correspondant \u00e0 ces conteneurs sont les fichiers qui seraient normalement retourn\u00e9s par le serveur. Ainsi, <code>&lt;Files index.html&gt;<\/code> s\u2019appliquera, que l\u2019on demande <code>\/<\/code> ou <code>\/index.html<\/code> (pour peu que la directive <code>DirectoryIndex<\/code> soit positionn\u00e9e pour servir <code>index.html<\/code> lorsqu\u2019on donne l\u2019adresse correspondant \u00e0 un r\u00e9pertoire).<\/p>\n\n\n\n<p><code>&lt;Files&gt;<\/code> et <code>&lt;FilesMatch&gt;<\/code> peuvent \u00eatre utilis\u00e9s dans un <code>.htaccess<\/code>.<\/p>\n\n\n\n<p>Les directives des conteneurs <code>&lt;Files&gt;<\/code> et <code>&lt;FilesMatch&gt;<\/code> seront \u00e9valu\u00e9es en m\u00eame temps mais ne se surchargeront pas comme <code>&lt;Directory&gt;<\/code> mais dans l\u2019ordre dans lequel les conteneurs sont plac\u00e9s dans les fichiers de configuration (\u00e9valuation des directives du 1<sup>er<\/sup> conteneur qui correspond, puis surcharge \u00e9ventuelles avec celles du 2<sup>\u00e8me<\/sup> conteneur correspondant).<\/p>\n\n\n\n<p>Notez que les sections <code>&lt;Files&gt;<\/code> peuvent \u00eatre imbriqu\u00e9es dans les sections <code>&lt;Directory&gt;<\/code> afin de restreindre la portion du syst\u00e8me de fichiers \u00e0 laquelle ces derni\u00e8res vont s\u2019appliquer.<\/p>\n\n\n\n<div class=\"wp-block-uagb-advanced-heading uagb-block-449c80f6\"><h3 class=\"uagb-heading-text\">3.1.4. Les conteneurs <code>Location<\/code> et <code>LocationMatch<\/code><\/h3><\/div>\n\n\n\n<p>Ces conteneurs fonctionnent selon les m\u00eames principes que les autres conteneurs, mais s\u2019appliquent uniquement sur les URL demand\u00e9es au serveur, <em>ind\u00e9pendamment<\/em> de la localisation physique de ces ressources (ces directives <em>ne consid\u00e8rent pas<\/em> l\u2019arborescence de fichiers).<\/p>\n\n\n\n<p>Un exemple typique d\u2019utilisation&nbsp;:<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;htmlmixed&quot;,&quot;mime&quot;:&quot;text\/html&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;languageLabel&quot;:&quot;no&quot;,&quot;language&quot;:&quot;HTML&quot;,&quot;modeName&quot;:&quot;html&quot;}\">&lt;Location \/status&gt;\n    SetHandler server-status\n    Require ip 127.0.0.1\n&lt;\/Location&gt;<\/pre><\/div>\n\n\n\n<p>Les URL d\u00e9finies en param\u00e8tres correspondent aux caract\u00e8res situ\u00e9s apr\u00e8s la base de l\u2019URL (en consid\u00e9rant que la base est constitu\u00e9e du protocole et du nom de domaine, comme <code>http:\/\/www.example.org<\/code> par exemple).<\/p>\n\n\n\n<p>On peut utiliser le <em>globbing<\/em> comme pour les conteneurs vus plus haut.<br>On peut utiliser une expression r\u00e9guli\u00e8re en ajoutant le caract\u00e8re <code>~<\/code>&nbsp;: <code>&lt;Location ~ &quot;\/(extra|special)\/data&quot;&gt;<\/code>.<\/p>\n\n\n\n<p>La variante <code>&lt;LocationMatch&gt;<\/code> fonctionne exactement comme le conteneur <code>&lt;Location ~&gt;<\/code>.<\/p>\n\n\n\n<p>Les directives des conteneurs <code>&lt;Location&gt;<\/code> et <code>&lt;LocationMatch&gt;<\/code> seront \u00e9valu\u00e9es en m\u00eame temps mais ne se surchargeront pas comme <code>&lt;Directory&gt;<\/code> mais dans l\u2019ordre dans lequel les conteneurs sont plac\u00e9s dans les fichiers de configuration (\u00e9valuation des directives du 1<sup>er<\/sup> conteneur qui correspond, puis surcharge \u00e9ventuelles avec celles du 2<sup>\u00e8me<\/sup> conteneur correspondant), comme pour les conteneurs <code>&lt;Files&gt;<\/code> et <code>&lt;FilesMatch&gt;<\/code>.<\/p>\n\n\n\n<p>Par exemple, une requ\u00eate pour <code>\/foo\/bar<\/code> correspondra \u00e0 <code>&lt;Location &quot;\/foo\/bar&quot;&gt;<\/code> et <code>&lt;Location &quot;\/foo&quot;&gt;<\/code>&nbsp;: les deux sections seront \u00e9valu\u00e9es mais selon l\u2019ordre dans lequel elles apparaissent dans le fichier de configuration.<\/p>\n\n\n\n<p><strong>NB<\/strong>&nbsp;: il n\u2019est pas possible d\u2019utiliser ces conteneurs dans un <code>.htaccess<\/code>.<\/p>\n\n\n\n<p><strong>\u00c9quivalent dans Nginx<\/strong><\/p>\n\n\n\n<p>L\u2019\u00e9quivalent Nginx est sans surprise le contexte <code>location<\/code>.<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;htmlmixed&quot;,&quot;mime&quot;:&quot;text\/html&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;languageLabel&quot;:&quot;no&quot;,&quot;language&quot;:&quot;HTML&quot;,&quot;modeName&quot;:&quot;html&quot;}\">location \/foo {\n    \u2026\n}<\/pre><\/div>\n\n\n\n<p>Il fonctionne cependant diff\u00e9remment.<\/p>\n\n\n\n<p>En effet, <code>location<\/code> peut \u00eatre utilis\u00e9e avec un <em>modifier<\/em>, plac\u00e9 juste apr\u00e8s la directive (et donc avant le chemin de l\u2019URL, appel\u00e9 ici pr\u00e9fixe), qui modifie son comportement&nbsp;:<\/p>\n\n\n\n<ul>\n<li><code>~<\/code> va utiliser le chemin comme une expression r\u00e9guli\u00e8re, en prenant en compte la casse&nbsp;;<\/li>\n\n\n\n<li><code>~*<\/code> fera de m\u00eame, mais sans tenir compte de la casse&nbsp;;<\/li>\n\n\n\n<li><code>=<\/code> ne prendra en compte que le chemin exact (<code>location = \/foo\/<\/code> ne fonctionnera que pour <code>\/foo\/<\/code>, pas pour <code>\/foo\/index.html<\/code>)&nbsp;;<\/li>\n\n\n\n<li><code>^~<\/code> n\u2019utilise pas d\u2019expression r\u00e9guli\u00e8re, nous verrons son utilit\u00e9 apr\u00e8s.<\/li>\n<\/ul>\n\n\n\n<p>Ordre d\u2019interpr\u00e9tation des contextes <code>location<\/code>&nbsp;:<\/p>\n\n\n\n<ul>\n<li><code>=<\/code> tout d\u2019abord, les correspondances exactes. Si une d\u2019entre elles est trouv\u00e9e, Nginx arr\u00eate l\u2019interpr\u00e9tation et utilise ce bloc&nbsp;;<\/li>\n\n\n\n<li>les autres <code>location<\/code> \u00e0 l\u2019exception de ceux utilisant les expressions r\u00e9guli\u00e8res (donc sans <em>modifier<\/em> ou avec le <em>modifier<\/em> <code>^~<\/code>). Si le bloc correspondant le mieux (eg. le plus pr\u00e9cis) poss\u00e8de le <em>modifier<\/em> <code>^~<\/code>, Nginx arr\u00eate l\u2019interpr\u00e9tation et utilise ce bloc&nbsp;;<\/li>\n\n\n\n<li><code>~<\/code> et <code>~*<\/code> sont interpr\u00e9t\u00e9s. Le premier (dans l\u2019ordre dans lequel ils sont \u00e9crits dans le fichier de configuration) qui correspond est utilis\u00e9 et Nginx arr\u00eate l\u2019interpr\u00e9tation&nbsp;;<\/li>\n\n\n\n<li>enfin, si aucun des <code>location<\/code> avec expression r\u00e9guli\u00e8re ne convient, c\u2019est celui avec le pr\u00e9fixe correspondant le mieux qui s\u2019appliquera.<\/li>\n<\/ul>\n\n\n\n<p>On remarquera que si les contextes <code>location<\/code> ne se surchargent pas, au contraire des <code>&lt;Location&gt;<\/code> d\u2019Apache, ils peuvent \u00eatre imbriqu\u00e9s&nbsp;:<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;htmlmixed&quot;,&quot;mime&quot;:&quot;text\/html&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;languageLabel&quot;:&quot;no&quot;,&quot;language&quot;:&quot;HTML&quot;,&quot;modeName&quot;:&quot;html&quot;}\">location \/a {\n    # On peut mettre ici des directives qui\n    # seront h\u00e9rit\u00e9es par les autres locations\n    location \/a {\n        \u2026\n    }\n    location \/a\/b {\n        \u2026\n    }\n}<\/pre><\/div>\n\n\n\n<p>\u00c0 noter&nbsp;: si le <code>location<\/code> de plus haut niveau utilise des regex, les <code>location<\/code> imbriqu\u00e9s devront eux aussi utiliser des regex.<\/p>\n\n\n\n<div class=\"wp-block-uagb-advanced-heading uagb-block-062f2dc2\"><h3 class=\"uagb-heading-text\">3.1.5. Le conteneur <code>If<\/code><\/h3><\/div>\n\n\n\n<p>Ce conteneur contient des directives appliqu\u00e9es si une condition est satisfaite au cours du traitement d\u2019une requ\u00eate.<\/p>\n\n\n\n<p>On pourra par exemple \u00e9valuer des en-t\u00eates de la requ\u00eate, v\u00e9rifier que la requ\u00eate est s\u00e9curis\u00e9e (<code>HTTPS<\/code>)\u2026<\/p>\n\n\n\n<p>La page <a href=\"https:\/\/httpd.apache.org\/docs\/2.4\/fr\/expr.html\">https:\/\/httpd.apache.org\/docs\/2.4\/fr\/expr.html<\/a> contient la documentation des conditions qu\u2019il est possible de tester.<\/p>\n\n\n\n<p>Par exemple, pour activer une directive si la requ\u00eate est s\u00e9curis\u00e9e&nbsp;:<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;clike&quot;,&quot;mime&quot;:&quot;text\/x-csrc&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;languageLabel&quot;:&quot;no&quot;,&quot;language&quot;:&quot;C&quot;,&quot;modeName&quot;:&quot;c&quot;}\">&lt;If %{HTTPS} == 'on'&gt;\n    \u2026\n&lt;\/If&gt;<\/pre><\/div>\n\n\n\n<p>On peut placer <code>&lt;If&gt;<\/code> dans tous les contextes (configuration globale, serveur virtuel, r\u00e9pertoire, .htaccess).<\/p>\n\n\n\n<p>Pour faire des \u00ab&nbsp;<em>else<\/em>&nbsp;\u00bb et des \u00ab&nbsp;<em>else if<\/em>&nbsp;\u00bb, on utilise les conteneurs <code>&lt;Else&gt;<\/code> et <code>&lt;ElsIf&gt;<\/code>&nbsp;:<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;htmlmixed&quot;,&quot;mime&quot;:&quot;text\/html&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:false,&quot;language&quot;:&quot;HTML&quot;,&quot;modeName&quot;:&quot;html&quot;}\">&lt;If &quot;-R '10.1.0.0\/16'&quot;&gt;\n  #...\n&lt;\/If&gt;\n&lt;ElseIf &quot;-R '10.0.0.0\/8'&quot;&gt;\n  #...\n&lt;\/ElseIf&gt;\n&lt;Else&gt;\n  #...\n&lt;\/Else&gt;<\/pre><\/div>\n\n\n\n<p><strong>\u00c9quivalent dans Nginx<\/strong><\/p>\n\n\n\n<p>L\u2019\u00e9quivalent Nginx est le contexte <code>if<\/code>.<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;shell&quot;,&quot;mime&quot;:&quot;text\/x-sh&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:false,&quot;languageLabel&quot;:&quot;no&quot;,&quot;language&quot;:&quot;Shell&quot;,&quot;modeName&quot;:&quot;shell&quot;}\">if ($https = 'on') {\n    \u2026\n}<\/pre><\/div>\n\n\n\n<p>On peut utiliser <code>if<\/code> dans les contextes <code>server<\/code> et <code>location<\/code> mais il n\u2019existe pas de syst\u00e8me de \u00ab&nbsp;<em>else<\/em>&nbsp;\u00bb.<\/p>\n\n\n\n<p><strong>Attention&nbsp;!<\/strong> L\u2019utilisation de <code>if<\/code> dans un contexte <code>location<\/code> peut avoir des effets de bords insoup\u00e7onn\u00e9s et devrait \u00eatre \u00e9vit\u00e9&nbsp;! La page <a href=\"https:\/\/www.nginx.com\/resources\/wiki\/start\/topics\/depth\/ifisevil\/\">https:\/\/www.nginx.com\/resources\/wiki\/start\/topics\/depth\/ifisevil\/<\/a> donne des exemples de comportements inattendus.<\/p>\n<\/div><\/div><\/div><\/div>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-group has-border-color has-vivid-cyan-blue-border-color has-background is-layout-flow\" style=\"border-style:dotted;border-width:2px;border-radius:8px;background-color:#fffdf8;padding-right:7px;padding-bottom:15px;padding-left:7px\">\n<h2 class=\"has-text-color wp-block-heading\" id=\"1-i-pr%C3%A9sentation\" style=\"color:#fffdf8;margin-top:0;margin-right:0;margin-bottom:0;margin-left:0;padding-top:0;padding-right:0;padding-bottom:0;padding-left:0;font-size:1px\">3.2. Le fichier .htaccess<\/h2>\n\n\n\n<div class=\"qubely-block-accordion  qubely-block-d34844\" data-item-toggle=\"true\">\n<div class=\"wp-block-qubely-accordion-item qubely-block-74605f\"><div class=\"qubely-accordion-item qubely-type-fill qubely-accordion-active\"><div class=\"qubely-accordion-panel qubely-icon-position-right\"><span class=\"qubely-accordion-panel-handler\" role=\"button\"><span class=\"qubely-accordion-panel-handler-label\">3.2. Le fichier <code>.htaccess<\/code><\/span><span class=\"qubely-accordion-icon fa fa-plus\"><\/span><\/span><\/div><div class=\"qubely-accordion-body\" style=\"display:block\"><div itemprop=\"text\">\n<p>Les directives d\u00e9crites dans le fichier <code>apache2.conf<\/code>, ainsi que les fichiers qui y sont int\u00e9gr\u00e9s (via des <code>Include<\/code>) stipulent des r\u00e8gles permettant une configuration totale d\u2019Apache. Cependant, il est \u00e9galement possible de configurer localement un r\u00e9pertoire g\u00e9r\u00e9 par Apache au moyen d\u2019un fichier, appel\u00e9 <code>.htaccess<\/code>, situ\u00e9 dans ce r\u00e9pertoire. Ce m\u00e9canisme pr\u00e9sente quelques avantages&nbsp;:<\/p>\n\n\n\n<ul>\n<li>Les directives associ\u00e9es \u00e0 un r\u00e9pertoire (c-\u00e0-d ce qu\u2019on peut mettre dans un conteneur <code>&lt;Directory&gt;<\/code>) peuvent \u00eatre totalement d\u00e9crites dans le fichier <code>.htaccess<\/code> associ\u00e9, ce qui permet alors d\u2019en avoir une vision globale. Si seules quelques directives y sont d\u00e9crites, les autres directives d\u00e9crites dans le fichier <code>apache2.conf<\/code> sont alors consid\u00e9r\u00e9es.<\/li>\n\n\n\n<li>Un administrateur Apache peut donner un droit de modification \u00e0 un fichier <code>.htaccess<\/code> \u00e0 un utilisateur non administrateur. Celui-ci a alors la possibilit\u00e9 de modifier les directives qui le concerne, sans avoir \u00e0 modifier le fichier g\u00e9n\u00e9ral de configuration <code>apache2.conf<\/code>.<\/li>\n\n\n\n<li>Les directives contenues dans un fichier <code>.htaccess<\/code> sont automatiquement prises en compte, pour toute requ\u00eate concernant le r\u00e9pertoire correspondant, sans avoir \u00e0 relancer Apache.<\/li>\n<\/ul>\n\n\n\n<p>Par d\u00e9faut, Apache cherche syst\u00e9matiquement le fichier <code>.htaccess<\/code> dans chaque r\u00e9pertoire concern\u00e9 par une requ\u00eate. Si ce fichier est trouv\u00e9, les directives qu\u2019il contient sont fusionn\u00e9es avec les directives globales pour d\u00e9terminer comment r\u00e9pondre \u00e0 la requ\u00eate re\u00e7ue.<\/p>\n\n\n\n<p>Un administrateur peut cependant restreindre les possibilit\u00e9s de configuration disponibles dans un fichier <code>.htaccess<\/code> au moyen des directive <code>AllowOverride<\/code><a href=\"https:\/\/luc.frama.io\/cours-asrall\/serveurs_web\/3_conteneurs.html#fn3\"><sup>3<\/sup><\/a> et <code>AllowOverrideList<\/code><a href=\"https:\/\/luc.frama.io\/cours-asrall\/serveurs_web\/3_conteneurs.html#fn4\"><sup>4<\/sup><\/a> (<strong>NB<\/strong>&nbsp;: celles-ci ne peuvent \u00eatre utilis\u00e9e que dans les sections <code>&lt;Directory&gt;<\/code> d\u00e9finies sans expressions rationnelles).<\/p>\n\n\n\n<p>La directive <code>AllowOverride<\/code> d\u00e9crit quelles sont les types de directives autoris\u00e9es \u00e0 \u00eatre surcharg\u00e9es dans un fichier <code>.htaccess<\/code>. Les valeurs suivantes peuvent \u00eatre associ\u00e9es \u00e0 cette directive&nbsp;:<\/p>\n\n\n\n<ul>\n<li><code>All<\/code>&nbsp;: autorise toutes les surcharges dans un fichier <code>.htaccess<\/code>&nbsp;;<\/li>\n\n\n\n<li><code>AuthConfig<\/code>&nbsp;: autorise les directives d\u2019autorisation&nbsp;;<\/li>\n\n\n\n<li><code>None<\/code>&nbsp;: interdit toutes les surcharges dans un fichier <code>.htaccess<\/code> ;<\/li>\n\n\n\n<li>D\u2019autres types de directives sont disponibles dans la documentation.<\/li>\n<\/ul>\n\n\n\n<p>La directive <code>AllowOverrideList<\/code> permet de d\u00e9crire pr\u00e9cis\u00e9ment les directives autoris\u00e9es en prenant comme arguments leurs noms (et non des types de directives, qui en regroupent plusieurs). Cela permet d\u2019\u00eatre plus pr\u00e9cis que <code>AllowOverride<\/code>.<\/p>\n<\/div><\/div><\/div><\/div>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-group has-border-color has-vivid-cyan-blue-border-color has-background is-layout-flow\" style=\"border-style:dotted;border-width:2px;border-radius:8px;background-color:#fffdf8;padding-right:7px;padding-bottom:15px;padding-left:7px\">\n<h2 class=\"has-text-color wp-block-heading\" id=\"1-i-pr%C3%A9sentation\" style=\"color:#fffdf8;margin-top:0;margin-right:0;margin-bottom:0;margin-left:0;padding-top:0;padding-right:0;padding-bottom:0;padding-left:0;font-size:1px\">3.4. Diff\u00e9rences et comparaison des contextes et directives Apache et Nginx<\/h2>\n\n\n\n<div class=\"qubely-block-accordion  qubely-block-d34844\" data-item-toggle=\"true\">\n<div class=\"wp-block-qubely-accordion-item qubely-block-34588d\"><div class=\"qubely-accordion-item qubely-type-fill qubely-accordion-active\"><div class=\"qubely-accordion-panel qubely-icon-position-right\"><span class=\"qubely-accordion-panel-handler\" role=\"button\"><span class=\"qubely-accordion-panel-handler-label\">3.3. Diff\u00e9rences et comparaison des contextes et directives Apache et Nginx<\/span><span class=\"qubely-accordion-icon fa fa-plus\"><\/span><\/span><\/div><div class=\"qubely-accordion-body\" style=\"display:block\"><div itemprop=\"text\">\n<div class=\"wp-block-uagb-advanced-heading uagb-block-704c795f\"><h3 class=\"uagb-heading-text\">3.3.1. Apache<\/h3><\/div>\n\n\n\n<p>Lorsque plusieurs conteneurs correspondent \u00e0 une seule requ\u00eate, des r\u00e8gles de priorit\u00e9 sont appliqu\u00e9es dans l\u2019ordre suivant&nbsp;:<\/p>\n\n\n\n<ol type=\"1\">\n<li>Les directives du contexte de configuration globale sont tout d\u2019abord consid\u00e9r\u00e9es.<\/li>\n\n\n\n<li>Les conteneurs <code>&lt;Directory&gt;<\/code> sont ensuite examin\u00e9s (sauf ceux utilisant des expressions r\u00e9guli\u00e8res) dans l\u2019ordre des port\u00e9es d\u00e9croissantes (du plus g\u00e9n\u00e9ral au plus sp\u00e9cifique). Lorsque des fichiers <code>.htaccess<\/code> existent dans ces r\u00e9pertoires, les directives qu\u2019ils contiennent, si elles peuvent \u00eatre prises en compte (voir la directive <code>AllowOverride<\/code> plus haut), surchargent celles d\u00e9finies dans les conteneurs <code>&lt;Directory&gt;<\/code>.<\/li>\n\n\n\n<li>Les conteneurs <code>&lt;DirectoryMatch&gt;<\/code> et <code>&lt;Directory ~&gt;<\/code>, contenant des expressions r\u00e9guli\u00e8res sont ensuite examin\u00e9es. Les directives qu\u2019ils contiennent surchargent celles d\u00e9finies \u00e0 l\u2019\u00e9tape 1 de cette liste.<\/li>\n\n\n\n<li>Les conteneurs <code>&lt;Files&gt;<\/code> et <code>&lt;FilesMatch&gt;<\/code> sont ensuite examin\u00e9s selon l\u2019ordre d\u2019apparition dans la configuration. Les directives qu\u2019ils contiennent surchargent celles d\u00e9finies aux \u00e9tapes pr\u00e9c\u00e9dentes de cette liste.<\/li>\n\n\n\n<li>Les conteneurs <code>&lt;Location&gt;<\/code> et <code>&lt;LocationMatch&gt;<\/code> sont ensuite examin\u00e9s selon l\u2019ordre d\u2019apparition dans la configuration. Les directives qu\u2019ils contiennent surchargent celles d\u00e9finies aux \u00e9tapes pr\u00e9c\u00e9dentes de cette liste.<\/li>\n\n\n\n<li>Enfin, les conteneurs <code>&lt;If&gt;<\/code> sont examin\u00e9s. Les directives qu\u2019ils contiennent, si les conditions des <code>&lt;If&gt;<\/code> sont remplies, surchargent celles d\u00e9finies aux \u00e9tapes pr\u00e9c\u00e9dentes de cette liste.<\/li>\n<\/ol>\n\n\n\n<p>Quand la requ\u00eate est servie par le module <code>mod_proxy<\/code><a href=\"https:\/\/luc.frama.io\/cours-asrall\/serveurs_web\/3_conteneurs.html#fn5\"><sup>5<\/sup><\/a>, le conteneur <code>&lt;Proxy&gt;<\/code><a href=\"https:\/\/luc.frama.io\/cours-asrall\/serveurs_web\/3_conteneurs.html#fn6\"><sup>6<\/sup><\/a> prend la place du conteneur <code>&lt;Directory&gt;<\/code> dans l\u2019ordre de traitement.<\/p>\n\n\n\n<p>La documentation de tout ceci est sur <a href=\"https:\/\/httpd.apache.org\/docs\/2.4\/fr\/sections.html#merging\">https:\/\/httpd.apache.org\/docs\/2.4\/fr\/sections.html#merging<\/a>.<\/p>\n\n\n\n<div class=\"wp-block-uagb-advanced-heading uagb-block-06efe7bd\"><h3 class=\"uagb-heading-text\">3.3.1. Nginx<\/h3><\/div>\n\n\n\n<p>Voir la partie sur le contexte <code>location<\/code>.<\/p>\n<\/div><\/div><\/div><\/div>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-group has-border-color has-vivid-cyan-blue-border-color has-background is-layout-flow\" style=\"border-style:dotted;border-width:2px;border-radius:8px;background-color:#fffdf8;padding-right:7px;padding-bottom:15px;padding-left:7px\">\n<h2 class=\"has-text-color wp-block-heading\" id=\"1-i-pr%C3%A9sentation\" style=\"color:#fffdf8;margin-top:0;margin-right:0;margin-bottom:0;margin-left:0;padding-top:0;padding-right:0;padding-bottom:0;padding-left:0;font-size:1px\">3.4. Les conteneurs Limit et LimitExcept<\/h2>\n\n\n\n<div class=\"qubely-block-accordion  qubely-block-d34844\" data-item-toggle=\"true\">\n<div class=\"wp-block-qubely-accordion-item qubely-block-10c402\"><div class=\"qubely-accordion-item qubely-type-fill qubely-accordion-active\"><div class=\"qubely-accordion-panel qubely-icon-position-right\"><span class=\"qubely-accordion-panel-handler\" role=\"button\"><span class=\"qubely-accordion-panel-handler-label\">3.4. Les conteneurs <code>&lt;Limit&gt;<\/code> et <code>&lt;LimitExcept&gt;<\/code><\/span><span class=\"qubely-accordion-icon fa fa-plus\"><\/span><\/span><\/div><div class=\"qubely-accordion-body\" style=\"display:block\"><div itemprop=\"text\">\n<p>Le conteneur <code>&lt;Limit&gt;<\/code> regroupe les directives qui ne s\u2019appliquent qu\u2019aux m\u00e9thodes pass\u00e9es en param\u00e8tres parmi les m\u00e9thodes suivantes&nbsp;: <code>GET<\/code>, <code>POST<\/code>, <code>PUT<\/code>, <code>DELETE<\/code>, <code>CONNECT<\/code>, <code>OPTIONS<\/code>, <code>PATCH<\/code>, <code>PROPFIND<\/code>, <code>PROPPATCH<\/code>, <code>MKCOL<\/code>, <code>COPY<\/code>, <code>MOVE<\/code>, <code>LOCK<\/code>, et <code>UNLOCK<\/code> (Attention, le nom des m\u00e9thodes est sensible \u00e0 la casse). Le conteneur <code>&lt;LimitExcept&gt;<\/code> regroupe les directives qui s\u2019appliquent \u00e0 toutes les m\u00e9thodes HTTP, sauf celles pass\u00e9es en param\u00e8tres.<\/p>\n\n\n\n<p>Ces conteneurs sont \u00e0 placer dans les conteneurs <code>&lt;Directory&gt;<\/code> et <code>&lt;DirectoryMatch&gt;<\/code>.<\/p>\n\n\n\n<p>Voici un squelette d\u2019exemple&nbsp;:<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;htmlmixed&quot;,&quot;mime&quot;:&quot;text\/html&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:false,&quot;language&quot;:&quot;HTML&quot;,&quot;modeName&quot;:&quot;html&quot;}\">&lt;Limit GET POST DELETE&gt;\n    \u2026\n&lt;\/Limit&gt;<\/pre><\/div>\n\n\n\n<p><strong>NB<\/strong>&nbsp;: lorsqu\u2019on autorise la m\u00e9thode <code>GET<\/code>, la m\u00e9thode <code>HEAD<\/code> est automatiquement autoris\u00e9e aussi.<\/p>\n\n\n\n<p>Les conteneurs <code>&lt;Limit&gt;<\/code> et <code>&lt;LimitExcept&gt;<\/code> peuvent \u00eatre plac\u00e9s dans les contextes r\u00e9pertoire et .htaccess.<\/p>\n\n\n\n<p><strong>\u00c9quivalent dans Nginx<\/strong><\/p>\n\n\n\n<p>Il n\u2019y a pas de <code>&lt;Limit&gt;<\/code> dans Nginx, juste le contexte <code>limit_except<\/code>. Son fonctionnement est similaire \u00e0 celui de <code>&lt;LimitExcept&gt;<\/code>. Ce contexte est \u00e0 placer dans un contexte <code>location<\/code>.<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;htmlmixed&quot;,&quot;mime&quot;:&quot;text\/html&quot;,&quot;theme&quot;:&quot;material&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;showPanel&quot;:false,&quot;language&quot;:&quot;HTML&quot;,&quot;modeName&quot;:&quot;html&quot;}\">limit_except GET POST {\n    \u2026\n}<\/pre><\/div>\n<\/div><\/div><\/div><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-column uag-hide-tab uag-hide-mob is-layout-flow\" style=\"flex-basis:170px\">\n\n<div class=\"cleanlogin-container\">\t\t\n\n\t<form class=\"cleanlogin-form\" method=\"post\" action=\"https:\/\/www.webodesign.net\/?page_id=2385\" onsubmit=\"submit.disabled = true; return true;\">\n\t\t\t\n\t\t<fieldset>\n\n\t\t\t\t\t\t<div class=\"cleanlogin-field\">\n                <label for=\"log\">Identifiant<\/label>\n\t\t\t\t<input class=\"cleanlogin-field-username\" type=\"text\" name=\"log\" placeholder=\"Identifiant\" aria-label=\"Identifiant\">\n\t\t\t<\/div>\n\t\t\t\n\t\t\t<div class=\"cleanlogin-field\">\n                <label for=\"pwd\">Mot de passe<\/label>\n\t\t\t\t<input class=\"cleanlogin-field-password\" type=\"password\" id=\"pwd\" name=\"pwd\" placeholder=\"Mot de passe\" aria-label=\"Mot de passe\">\n                <i class=\"bi bi-eye-slash\" id=\"togglePassword\"><\/i>\n\t\t\t<\/div>\n\n\t\t\t\t\t\n\t\t\t<input type=\"hidden\" name=\"clean_login_wpnonce\" value=\"e994c14fba\">\n            \n\t\t\t\t\t<\/fieldset>\n\t\t\n\t\t<fieldset>\n\t\t\t<input class=\"cleanlogin-field\" type=\"submit\" value=\"Se connecter\" name=\"submit\">\n\t\t\t<input type=\"hidden\" name=\"action\" value=\"login\">\n\t\t\t\n\t\t\t<div class=\"cleanlogin-field cleanlogin-field-remember\">\n\t\t\t\t<input type=\"checkbox\" id=\"rememberme\" name=\"rememberme\" value=\"forever\">\n\t\t\t\t<label for=\"rememberme\">Se souvenir de moi\u00a0?<\/label>\n\t\t\t<\/div>\n\t\t<\/fieldset>\n\n\t\t\n\t\t<div class=\"cleanlogin-form-bottom\">\n\t\t\t\n            \n\t\t\t\t\t\t\t\t\t\n\t\t<\/div>\n\t\t\n\t<\/form>\n\n<\/div>\n\n<script>\nconst togglePassword = document.querySelector('#togglePassword');\nconst password = document.querySelector('#pwd');\n\ntogglePassword.addEventListener('click', function (e) {\n    const type = password.getAttribute('type') === 'password' ? 'text' : 'password';\n    password.setAttribute('type', type);\n    this.classList.toggle('bi-eye');\n});\n<\/script>\n<\/div>\n<\/div>\n<\/div><\/div>\n","protected":false},"excerpt":{"rendered":"<p>3. Conteneurs Apache, .htaccess et \u00e9quivalents Nginx On rappelle que les directives d\u2019Apache, permettant de configurer ce serveur, peuvent \u00eatre d\u00e9clar\u00e9es dans 4 contextes diff\u00e9rents&nbsp;: de configuration globale, h\u00f4te virtuel, r\u00e9pertoire et .htaccess. Un index des directives expliquant le d\u00e9tail de leur fonctionnement, ainsi qu\u2019une liste des nombreux modules existants sont disponibles sur le site [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":2308,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"qubely_global_settings":"","qubely_interactions":"","_uag_custom_page_level_css":""},"categories":[16],"tags":[],"qubely_featured_image_url":{"full":["https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/apache-ngnix-servers-03.jpg",940,490,false],"landscape":["https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/apache-ngnix-servers-03.jpg",940,490,false],"portraits":["https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/apache-ngnix-servers-03-540x320.jpg",540,320,true],"thumbnail":["https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/apache-ngnix-servers-03-150x150.jpg",150,150,true],"medium":["https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/apache-ngnix-servers-03-300x156.jpg",300,156,true],"medium_large":["https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/apache-ngnix-servers-03-768x400.jpg",768,400,true],"large":["https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/apache-ngnix-servers-03.jpg",940,490,false],"1536x1536":["https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/apache-ngnix-servers-03.jpg",940,490,false],"2048x2048":["https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/apache-ngnix-servers-03.jpg",940,490,false],"qubely_landscape":["https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/apache-ngnix-servers-03.jpg",940,490,false],"qubely_portrait":["https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/apache-ngnix-servers-03-540x320.jpg",540,320,true],"qubely_thumbnail":["https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/apache-ngnix-servers-03-140x100.jpg",140,100,true]},"qubely_author":{"display_name":"R\u00e9mi","author_link":"https:\/\/www.webodesign.net\/?author=3"},"qubely_comment":0,"qubely_category":"<a href=\"https:\/\/www.webodesign.net\/?cat=16\" rel=\"category\">Tutoriels Linux-Debian<\/a>","qubely_excerpt":"3. Conteneurs Apache, .htaccess et \u00e9quivalents Nginx On rappelle que les directives d\u2019Apache, permettant de configurer ce serveur, peuvent \u00eatre d\u00e9clar\u00e9es dans 4 contextes diff\u00e9rents&nbsp;: de configuration globale, h\u00f4te virtuel, r\u00e9pertoire et .htaccess. Un index des directives expliquant le d\u00e9tail de leur fonctionnement, ainsi qu\u2019une liste des nombreux modules existants sont disponibles sur le site\u2026","uagb_featured_image_src":{"full":["https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/apache-ngnix-servers-03.jpg",940,490,false],"thumbnail":["https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/apache-ngnix-servers-03-150x150.jpg",150,150,true],"medium":["https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/apache-ngnix-servers-03-300x156.jpg",300,156,true],"medium_large":["https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/apache-ngnix-servers-03-768x400.jpg",768,400,true],"large":["https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/apache-ngnix-servers-03.jpg",940,490,false],"1536x1536":["https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/apache-ngnix-servers-03.jpg",940,490,false],"2048x2048":["https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/apache-ngnix-servers-03.jpg",940,490,false],"qubely_landscape":["https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/apache-ngnix-servers-03.jpg",940,490,false],"qubely_portrait":["https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/apache-ngnix-servers-03-540x320.jpg",540,320,true],"qubely_thumbnail":["https:\/\/www.webodesign.net\/wp-content\/uploads\/2023\/01\/apache-ngnix-servers-03-140x100.jpg",140,100,true]},"uagb_author_info":{"display_name":"R\u00e9mi","author_link":"https:\/\/www.webodesign.net\/?author=3"},"uagb_comment_info":0,"uagb_excerpt":"3. Conteneurs Apache, .htaccess et \u00e9quivalents Nginx On rappelle que les directives d\u2019Apache, permettant de configurer ce serveur, peuvent \u00eatre d\u00e9clar\u00e9es dans 4 contextes diff\u00e9rents&nbsp;: de configuration globale, h\u00f4te virtuel, r\u00e9pertoire et .htaccess. Un index des directives expliquant le d\u00e9tail de leur fonctionnement, ainsi qu\u2019une liste des nombreux modules existants sont disponibles sur le site\u2026","_links":{"self":[{"href":"https:\/\/www.webodesign.net\/index.php?rest_route=\/wp\/v2\/posts\/2307"}],"collection":[{"href":"https:\/\/www.webodesign.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.webodesign.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.webodesign.net\/index.php?rest_route=\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.webodesign.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2307"}],"version-history":[{"count":5,"href":"https:\/\/www.webodesign.net\/index.php?rest_route=\/wp\/v2\/posts\/2307\/revisions"}],"predecessor-version":[{"id":2327,"href":"https:\/\/www.webodesign.net\/index.php?rest_route=\/wp\/v2\/posts\/2307\/revisions\/2327"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.webodesign.net\/index.php?rest_route=\/wp\/v2\/media\/2308"}],"wp:attachment":[{"href":"https:\/\/www.webodesign.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2307"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.webodesign.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2307"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.webodesign.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2307"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}