{"id":1723,"date":"2022-10-15T14:00:40","date_gmt":"2022-10-15T12:00:40","guid":{"rendered":"https:\/\/jagullo.fr\/blog\/?p=1723"},"modified":"2022-10-15T17:17:42","modified_gmt":"2022-10-15T15:17:42","slug":"creer-un-fichier-htaccess-sur-apache","status":"publish","type":"post","link":"https:\/\/jagullo.fr\/blog\/creer-un-fichier-htaccess-sur-apache\/","title":{"rendered":"Cr\u00e9er un fichier .htaccess sur Apache"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Le fichier .htaccess qu\u00e9saco ?<\/h2>\n\n\n\n<p>Le .htaccess est un fichier texte de configuration <strong>pour param\u00e9trer un serveur web<\/strong> sous Apache afin d&rsquo;appliquer  certaines optimisations pour un site web plus rapide et une meilleure s\u00e9curit\u00e9. Il peut se situer \u00e0 la racine de l&rsquo;espace web ou dans n&rsquo;importe quel autre dossier. Les directives indiqu\u00e9es s&rsquo;appliqueront au dossier et aux sous-dossiers dans lequel il se trouve. Il permet de r\u00e9aliser <strong>des optimisations, des redirections <\/strong>ou<strong> de s\u00e9curiser <\/strong>l&rsquo;acc\u00e8s \u00e0 certains fichiers et r\u00e9pertoires. Il peut modifier le comportement par d\u00e9faut du fichier httpd.conf et du php.ini selon les h\u00e9bergeurs. Il est pr\u00e9f\u00e9rable d&rsquo;utiliser directement les fichiers de configuration du serveur, mais dans certains cas, comme sur un h\u00e9bergement web mutualis\u00e9, il n&rsquo;est pas possible d&rsquo;y acc\u00e9der.<\/p>\n\n\n\n<p>Ce fichier de configuration est exclusivement utilis\u00e9 <strong>sur un serveur web Apache<\/strong>. Il n&rsquo;est donc pas possible de l&rsquo;int\u00e9grer sur un serveur Nginx ou Node.js par exemple cela ne fonctionnera pas. <a href=\"https:\/\/httpd.apache.org\/docs\/2.4\/fr\/howto\/htaccess.html\" target=\"_blank\" rel=\"noreferrer noopener\">La documentation<\/a> renseigne sur son utilisation et les diff\u00e9rentes directives qu&rsquo;on peut lui appliquer. Il faut faire attention \u00e0 ne jamais le modifier directement sur un site web en production sans l&rsquo;avoir pr\u00e9alablement bien test\u00e9. Une mauvaise configuration peut entra\u00eener une <strong>500 Internal Server Error<\/strong> rendant un site indisponible. V\u00e9rifier en local ou sur un serveur de pr\u00e9prod le bon fonctionnement du .htaccess avant de l&rsquo;uploader dans le r\u00e9pertoire racine de son un site web.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/jagullo.fr\/blog\/wp-content\/uploads\/2022\/10\/illustration_htaccess.jpg\" alt=\"\" class=\"wp-image-1778\" width=\"720\" height=\"480\"\/><figcaption>Modifier la configuration d&rsquo;un serveur web avec le fichier .htaccess<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Les conteneurs de section<\/h2>\n\n\n\n<p>Les directives indiqu\u00e9es dans un fichier .htaccess peuvent s&rsquo;appliquer selon des conditions. Ces conteneurs de sections de configuration sont de plusieurs types. Le <strong>ifDefine<\/strong> s&rsquo;applique que sur les constantes utilis\u00e9es lors du d\u00e9marrage du serveur par la ligne de commande. Le <strong>ifModule<\/strong>, comme dans l&rsquo;exemple ci-dessous, s&rsquo;applique que si le module est disponible.  Il existe aussi la condition <strong>ifVersion<\/strong> d\u00e9pendant de la version du serveur.<\/p>\n\n\n\n<pre class=\"wp-block-code language-apacheconf\"><code>&lt;ifModule mod_headers.c&gt;\n  Header always set X-FRAME-OPTIONS \"SAMEORIGIN\"\n  ...\n&lt;\/ifModule&gt;<\/code><\/pre>\n\n\n\n<p>Les conteneurs de syst\u00e8me de fichier quant \u00e0 eux appliqueront les directives renseign\u00e9es seulement dans le r\u00e9pertoire ou le fichier indiqu\u00e9. On retrouve les conteneurs <strong>Directory<\/strong> ou <strong>Files<\/strong> par exemple qui permettent de cibler seulement le r\u00e9pertoire ou le fichier sur le serveur. Il existe d&rsquo;autres conteneurs sur <a href=\"https:\/\/httpd.apache.org\/docs\/2.4\/fr\/sections.html\" target=\"_blank\" rel=\"noreferrer noopener\">la documentation des sections<\/a>.<\/p>\n\n\n\n<pre class=\"wp-block-code language-apacheconf\"><code>&lt;Directory \"\/var\/www\/inc\"&gt;\n  Options +Indexes\n  ...\n&lt;\/Directory&gt;\n\n&lt;Files .htaccess&gt;\n  order allow,deny\n  deny from all\n&lt;\/Files&gt;<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">S\u00e9curiser les en-t\u00eates des requ\u00eates<\/h2>\n\n\n\n<p>La s\u00e9curisation des<strong> <\/strong>en-t\u00eates<strong> <\/strong>permet en 3 lignes de s\u00e9curiser son site sur plusieurs failles de s\u00e9curit\u00e9. La directive <strong>X-FRAME-OPTIONS<\/strong> va emp\u00eacher un site malveillant d&rsquo;afficher un autre site dans une iframe, <strong>X-XSS-Protection<\/strong> permet de se pr\u00e9munir des attaques XSS et <strong>X-Content-Type-Options<\/strong> s\u00e9curise contre le MIME sniffing.<\/p>\n\n\n\n<pre class=\"wp-block-code language-apacheconf\"><code>&lt;ifModule mod_headers.c&gt;\n  Header always set X-FRAME-OPTIONS \"SAMEORIGIN\"\n  Header always set X-XSS-Protection \"1; mode=block\"\n  Header always set X-Content-Type-Options \"nosniff\"\n&lt;\/ifModule&gt;<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Optimiser le cache du navigateur<\/h2>\n\n\n\n<p>Pour optimiser le cache des assets d&rsquo;un site Internet pour les navigateurs, il est possible d&rsquo;op\u00e9rer sur l&rsquo;en-t\u00eate des requ\u00eates avec le <strong>Cache-Control<\/strong> et sur l&rsquo;expiration avec la directive <strong>ExpiresByType<\/strong>. En dessous du d\u00e9lai indiqu\u00e9 via <strong>max-age<\/strong> et <strong>access plus<\/strong>, toute requ\u00eate d&rsquo;un navigateur va utiliser les assets au niveau du cache au lieu de les ret\u00e9l\u00e9charger du serveur. Cela va servir surtout pour les visiteurs qui naviguent sur plusieurs pages du site ou ceux qui reviennent apr\u00e8s un certain d\u00e9lai.<\/p>\n\n\n\n<pre class=\"wp-block-code language-apacheconf\"><code>&lt;ifModule mod_headers.c&gt;\n  &lt;filesmatch \"\\\\.(ico|jpe?g|png|gif|swf|gz|ttf|woff|woff2)$\"&gt;\n    Header set Cache-Control \"max-age=31536000, public\"\n  &lt;\/filesmatch&gt;\n  &lt;filesmatch \"\\\\.(css|js)$\"&gt;\n    Header set Cache-Control \"max-age=14400, private\"\n  &lt;\/filesmatch&gt;\n  &lt;filesmatch \"\\.(pl|php|cgi|spl|scgi|fcgi)$\"&gt;\n    Header unset Cache-Control\n  &lt;\/filesmatch&gt;\n&lt;\/ifModule&gt;\n\n&lt;ifModule mod_expires.c&gt;\n  ExpiresActive On\n  ExpiresDefault \"access plus 7200 seconds\"\n  ExpiresByType image\/jpeg \"access plus 31536000 seconds\"\n  ExpiresByType image\/png \"access plus 31536000 seconds\"\n  ExpiresByType image\/gif \"access plus 31536000 seconds\"\n  ExpiresByType image\/ico \"access plus 31536000 seconds\"\n  ExpiresByType image\/icon \"access plus 31536000 seconds\"\n  ExpiresByType image\/x-icon \"access plus 31536000 seconds\"\n  ExpiresByType image\/svg+xml \"access plus 31536000 seconds\"\n  ExpiresByType image\/vnd.microsoft.icon \"access plus 31536000 seconds\"\n  ExpiresByType text\/css \"access plus 14400 seconds\"\n  ExpiresByType text\/javascript \"access plus 14400 seconds\"\n  ExpiresByType text\/html \"access plus 7200 seconds\"\n  ExpiresByType text\/xml \"access plus 31536000 seconds\"\n  ExpiresByType application\/xhtml+xml \"access plus 14400 seconds\"\n  ExpiresByType application\/javascript \"access plus 14400 seconds\"\n  ExpiresByType application\/x-javascript \"access plus 31536000 seconds\"\n  ExpiresByType application\/x-shockwave-flash \"access plus 31536000 seconds\"\n  ExpiresByType video\/x-flv \"access plus 31536000 seconds\"\n&lt;\/ifModule&gt;<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Compresser les requ\u00eates<\/h2>\n\n\n\n<p>Il est possible de compresser certaines donn\u00e9es renvoy\u00e9es par le serveur avec les formats <strong>gzip<\/strong> et <strong>zlib<\/strong>. Pour cela il faut que les modules <strong>mod_gzip<\/strong> et <strong>mod_deflate<\/strong> soient install\u00e9s sur le serveur web. Les \u00e9l\u00e9ments \u00e0 compresser concernent surtout la sortie HTML ainsi que les images et les assets CSS et JavaScript pour qu&rsquo;ils soient un peu plus l\u00e9gers \u00e0 t\u00e9l\u00e9charger.<\/p>\n\n\n\n<pre class=\"wp-block-code language-apacheconf\"><code>&lt;ifModule mod_gzip.c&gt;\n  mod_gzip_on Yes\n  mod_gzip_dechunk Yes\n  mod_gzip_item_include file \\.(html?|txt|css|js|php|pl)$\n  mod_gzip_item_include handler ^cgi-script$\n  mod_gzip_item_include mime ^text\/.*\n  mod_gzip_item_include mime ^application\/x-javascript.*\n  mod_gzip_item_exclude mime ^image\/.*\n  mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*\n&lt;\/ifModule&gt;\n\n&lt;IfModule mod_deflate.c&gt;\n  SetOutputFilter DEFLATE\n  AddOutputFilterByType DEFLATE text\/html text\/xml application\/xhtml+xml text\/plain text\/css text\/javascript application\/javascript\n  SetEnvIfNoCase Request_URI \\.(zip|rar|pdf|mp4|wmv)$ no-gzip Vary Accept-Encoding\n&lt;\/IfModule&gt;<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"> Autres fonctionnalit\u00e9s du .htaccess<\/h2>\n\n\n\n<p>Il existe d&rsquo;autres fonctionnalit\u00e9s que l&rsquo;on peut faire \u00e0 partir d&rsquo;un fichier .htaccess pour modifier la configuration par d\u00e9faut d&rsquo;Apache. Par exemple, on peut r\u00e9aliser des redirections avec le module <strong>mod_rewrite<\/strong> ou bien personnaliser les messages d&rsquo;erreur avec la directive <strong>ErrorDocument<\/strong>. Il est possible de modifier le fichier d&rsquo;index par d\u00e9faut d&rsquo;un r\u00e9pertoire avec la directive <strong>DirectoryIndex<\/strong>. Enfin on peut bloquer l&rsquo;indexation d&rsquo;un r\u00e9pertoire avec <strong>Options -Indexes<\/strong> afin d&#8217;emp\u00eacher \u00e0 un visiteur de voir tous les fichiers qui s&rsquo;y trouvent. Ci-dessous un r\u00e9capitulatif d&rsquo;un fichier .htaccess \u00e0 mettre dans le r\u00e9pertoire public de son serveur en production pour une bonne configuration au niveau s\u00e9curit\u00e9 et optimisation.<\/p>\n\n\n\n<pre class=\"wp-block-code language-apacheconf\"><code>Options -Indexes\n\n&lt;ifModule mod_headers.c&gt;\n  Header always set X-FRAME-OPTIONS \"SAMEORIGIN\"\n  Header always set X-XSS-Protection \"1; mode=block\"\n  Header always set X-Content-Type-Options \"nosniff\"\n  &lt;filesmatch \"\\\\.(ico|jpe?g|png|gif|swf|gz|ttf|css|woff|woff2)$\"&gt;\n    Header set Cache-Control \"max-age=31536000, public\"\n  &lt;\/filesmatch&gt;\n  &lt;filesmatch \"\\\\.(js)$\"&gt;\n    Header set Cache-Control \"max-age=2592000, private\"\n  &lt;\/filesmatch&gt;\n  &lt;filesmatch \"\\.(pl|php|cgi|spl|scgi|fcgi)$\"&gt;\n    Header unset Cache-Control\n  &lt;\/filesmatch&gt;\n&lt;\/ifModule&gt;\n\n&lt;ifModule mod_expires.c&gt;\n  ExpiresActive On\n  ExpiresDefault \"access plus 7200 seconds\"\n  ExpiresByType image\/jpeg \"access plus 31536000 seconds\"\n  ExpiresByType image\/png \"access plus 31536000 seconds\"\n  ExpiresByType image\/gif \"access plus 31536000 seconds\"\n  ExpiresByType image\/ico \"access plus 31536000 seconds\"\n  ExpiresByType image\/icon \"access plus 31536000 seconds\"\n  ExpiresByType image\/x-icon \"access plus 31536000 seconds\"\n  ExpiresByType image\/svg+xml \"access plus 31536000 seconds\"\n  ExpiresByType image\/vnd.microsoft.icon \"access plus 31536000 seconds\"\n  ExpiresByType text\/css \"access plus 14400 seconds\"\n  ExpiresByType text\/javascript \"access plus 14400 seconds\"\n  ExpiresByType text\/html \"access plus 7200 seconds\"\n  ExpiresByType text\/xml \"access plus 31536000 seconds\"\n  ExpiresByType application\/xhtml+xml \"access plus 14400 seconds\"\n  ExpiresByType application\/javascript \"access plus 14400 seconds\"\n  ExpiresByType application\/x-javascript \"access plus 31536000 seconds\"\n  ExpiresByType application\/x-shockwave-flash \"access plus 31536000 seconds\"\n  ExpiresByType video\/x-flv \"access plus 31536000 seconds\"\n&lt;\/ifModule&gt;\n\n&lt;ifModule mod_gzip.c&gt;\n  mod_gzip_on Yes\n  mod_gzip_dechunk Yes\n  mod_gzip_item_include file \\.(html?|txt|css|js|php|pl)$\n  mod_gzip_item_include handler ^cgi-script$\n  mod_gzip_item_include mime ^text\/.*\n  mod_gzip_item_include mime ^application\/x-javascript.*\n  mod_gzip_item_exclude mime ^image\/.*\n  mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*\n&lt;\/ifModule&gt;\n\n&lt;IfModule mod_deflate.c&gt;\n  SetOutputFilter DEFLATE\n  AddOutputFilterByType DEFLATE text\/html text\/xml application\/xhtml+xml text\/plain text\/css text\/javascript application\/javascript\n  SetEnvIfNoCase Request_URI \\.(zip|rar|pdf|mp4|wmv)$ no-gzip Vary Accept-Encoding\n&lt;\/IfModule&gt;\n\n&lt;Files .htaccess&gt;\n  order allow,deny\n  deny from all\n&lt;\/Files&gt;<\/code><\/pre>\n\n\n\n<link rel=\"stylesheet\" href=\"\/blog\/wp-content\/themes\/Extra-child\/assets\/css\/prism.css\">\n<script src=\"\/blog\/wp-content\/themes\/Extra-child\/assets\/js\/prism.js\"><\/script>\n<div class=\"list-tags\"><a href=\"https:\/\/jagullo.fr\/blog\/tag\/apache\/\" class=\"link-tag\" title=\"Apache\">Apache<\/a><a href=\"https:\/\/jagullo.fr\/blog\/tag\/seo\/\" class=\"link-tag\" title=\"SEO\">SEO<\/a><\/div>","protected":false},"excerpt":{"rendered":"<p>Le fichier .htaccess qu\u00e9saco ? Le .htaccess est un fichier texte de configuration pour param\u00e9trer un serveur web sous Apache afin d&rsquo;appliquer certaines optimisations pour un site web plus rapide et une meilleure s\u00e9curit\u00e9. Il peut se situer \u00e0 la racine de l&rsquo;espace web ou dans n&rsquo;importe quel autre dossier. Les directives indiqu\u00e9es s&rsquo;appliqueront au [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1792,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_et_pb_use_builder":"","_et_pb_old_content":"","_et_gb_content_width":"","footnotes":""},"categories":[8],"tags":[37,36],"class_list":["post-1723","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-developpement","tag-apache","tag-seo","et-has-post-format-content","et_post_format-et-post-format-standard"],"_links":{"self":[{"href":"https:\/\/jagullo.fr\/blog\/wp-json\/wp\/v2\/posts\/1723","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jagullo.fr\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jagullo.fr\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jagullo.fr\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/jagullo.fr\/blog\/wp-json\/wp\/v2\/comments?post=1723"}],"version-history":[{"count":2,"href":"https:\/\/jagullo.fr\/blog\/wp-json\/wp\/v2\/posts\/1723\/revisions"}],"predecessor-version":[{"id":1858,"href":"https:\/\/jagullo.fr\/blog\/wp-json\/wp\/v2\/posts\/1723\/revisions\/1858"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/jagullo.fr\/blog\/wp-json\/wp\/v2\/media\/1792"}],"wp:attachment":[{"href":"https:\/\/jagullo.fr\/blog\/wp-json\/wp\/v2\/media?parent=1723"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jagullo.fr\/blog\/wp-json\/wp\/v2\/categories?post=1723"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jagullo.fr\/blog\/wp-json\/wp\/v2\/tags?post=1723"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}