HEX
Server: Apache
System: Linux wp-jo-wordpress-79f99b7d9d-ngh2p 6.12.67-0-virt #1-Alpine SMP PREEMPT_DYNAMIC 2026-01-27 02:08:12 x86_64
User: (1001)
PHP: 8.4.25
Disabled: NONE
Upload Files
File: /opt/bitnami/apache2/manual/mod/mod_authn_socache.html.fr.utf8
<!DOCTYPE html SYSTEM "about:legacy-compat">
<html lang="fr"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta content="width=device-width, initial-scale=1" name="viewport">
<!--
        XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
              This file is generated from xml source: DO NOT EDIT
        XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
      -->
<title>mod_authn_socache - Serveur HTTP Apache Version 2.4</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 rel="stylesheet" type="text/css" href="../style/css/prettify.css">
<script src="../style/scripts/prettify.min.js">
</script>

<link href="../images/favicon.png" rel="shortcut icon"></head>
<body>
<div id="page-header">
<p class="menu"><a href="../mod/">Modules</a> | <a href="../mod/quickreference.html">Directives</a> | <a href="https://cwiki.apache.org/confluence/display/httpd/FAQ">FAQ</a> | <a href="../glossary.html">Glossaire</a> | <a href="../sitemap.html">Plan du site</a> | <a href="https://bz.apache.org/bugzilla/enter_bug.cgi?product=Apache%20httpd-2">Signaler un bug</a></p>
<p class="apache">Serveur HTTP Apache Version 2.4</p>
<img alt="" src="../images/feather.png"></div>
<div class="up"><a href="./"><img title="<-" alt="<-" src="../images/left.gif"></a></div>
<div id="path">
<a href="https://www.apache.org/">Apache</a> &gt; <a href="https://httpd.apache.org/">Serveur HTTP</a> &gt; <a href="https://httpd.apache.org/docs/">Documentation</a> &gt; <a href="../">Version 2.4</a> &gt; <a href="./">Modules</a></div>
<div id="page-content">
<div id="preamble"><h1>Module Apache mod_authn_socache</h1>
<button aria-label="Toggle language list" class="lang-toggle"><svg xmlns="http://www.w3.org/2000/svg" stroke-width="2" stroke="currentColor" fill="none" viewBox="0 0 24 24" height="16" width="16"><circle r="10" cy="12" cx="12"/><line y2="12" x2="22" y1="12" x1="2"/><path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"/></svg></button>
<div class="toplang">
<p><span>Langues Disponibles: </span><a href="../en/mod/mod_authn_socache.html" hreflang="en" rel="alternate" title="English">&nbsp;en&nbsp;</a> |
<a href="../fr/mod/mod_authn_socache.html" title="Fran&ccedil;ais">&nbsp;fr&nbsp;</a></p>
</div>
<table class="module"><tr><th><a href="module-dict.html#Description">Description:</a></th><td>G&egrave;re un cache des donn&eacute;es d'authentification pour diminuer
la charge des serveurs d'arri&egrave;re-plan</td></tr>
<tr><th><a href="module-dict.html#Status">Statut:</a></th><td>Base</td></tr>
<tr><th><a href="module-dict.html#ModuleIdentifier">Identificateur&nbsp;de&nbsp;Module:</a></th><td>authn_socache_module</td></tr>
<tr><th><a href="module-dict.html#SourceFile">Fichier&nbsp;Source:</a></th><td>mod_authn_socache.c</td></tr>
<tr><th><a href="module-dict.html#Compatibility">Compatibilit&eacute;:</a></th><td>Versions 2.3 et ult&eacute;rieures</td></tr></table>
<h3>Sommaire</h3>

    <p>Maintient un cache des donn&eacute;es d'authentification pour limiter
    les sollicitations du serveur d'arri&egrave;re-plan.</p>
</div>
<div id="quickview"><h3>Sujets</h3>
<ul id="topics">
<li><img alt="" src="../images/down.gif"> <a href="#intro">Mise en cache des donn&eacute;es d'authentification</a></li>
<li><img alt="" src="../images/down.gif"> <a href="#usage">Utilisation</a></li>
<li><img alt="" src="../images/down.gif"> <a href="#dev">La mise en cache avec les modules tiers</a></li>
</ul><h3 class="directives">Directives</h3>
<ul id="toc">
<li><img alt="" src="../images/down.gif"> <a href="#authncachecontext">AuthnCacheContext</a></li>
<li><img alt="" src="../images/down.gif"> <a href="#authncacheenable">AuthnCacheEnable</a></li>
<li><img alt="" src="../images/down.gif"> <a href="#authncacheprovidefor">AuthnCacheProvideFor</a></li>
<li><img alt="" src="../images/down.gif"> <a href="#authncachesocache">AuthnCacheSOCache</a></li>
<li><img alt="" src="../images/down.gif"> <a href="#authncachetimeout">AuthnCacheTimeout</a></li>
</ul>
<h3>Traitement des bugs</h3><ul class="seealso"><li><a href="https://www.apache.org/dist/httpd/CHANGES_2.4">Journal des modifications de httpd</a></li><li><a href="https://bz.apache.org/bugzilla/buglist.cgi?bug_status=__open__&amp;list_id=144532&amp;product=Apache%20httpd-2&amp;query_format=specific&amp;order=changeddate%20DESC%2Cpriority%2Cbug_severity&amp;component=mod_authn_socache">Probl&egrave;mes connus</a></li><li><a href="https://bz.apache.org/bugzilla/enter_bug.cgi?product=Apache%20httpd-2&amp;component=mod_authn_socache">Signaler un bug</a></li></ul></div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="section">
<h2 id="intro">Mise en cache des donn&eacute;es d'authentification <a title="Lien permanent" href="#intro" class="permalink">&para;</a></h2>
    <p>Certains utilisateurs qui mettent en oeuvre une authentification
    lourde s'appuyant par exemple sur des requ&ecirc;tes SQL
    (<code class="module"><a href="../mod/mod_authn_dbd.html">mod_authn_dbd</a></code>) ont signal&eacute; une charge induite
    inacceptable sur leur fournisseur d'authentification. Cela se
    produit typiquement dans le cas o&ugrave; une page HTML contient des
    centaines d'objets (images, scripts, pages de styles, media,
    etc...), et o&ugrave; une requ&ecirc;te pour cette page g&eacute;n&egrave;re des centaines de
    sous-requ&ecirc;tes &agrave; effet imm&eacute;diat pour des contenus suppl&eacute;mentaires
    authentifi&eacute;s.</p>
    <p>Pour r&eacute;soudre ce probl&egrave;me, <code class="module"><a href="../mod/mod_authn_socache.html">mod_authn_socache</a></code> fournit une
    solution qui permet de maintenir un cache des donn&eacute;es
    d'authentification.</p>
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="section">
<h2 id="usage">Utilisation <a title="Lien permanent" href="#usage" class="permalink">&para;</a></h2>
    <p>Le cache d'authentification doit &ecirc;tre utilis&eacute; lorsque les
    requ&ecirc;tes d'authentification induisent une charge significative sur le
    serveur, le serveur d'arri&egrave;re-plan ou le r&eacute;seau. Cette mise en cache
    n'apportera probablement aucune am&eacute;lioration dans le cas d'une
    authentification &agrave; base de fichier (<code class="module"><a href="../mod/mod_authn_file.html">mod_authn_file</a></code>)
    ou de base de donn&eacute;es dbm (<code class="module"><a href="../mod/mod_authn_dbm.html">mod_authn_dbm</a></code>) car ces
    m&eacute;thodes sont de par leur conception rapides et l&eacute;g&egrave;res (la mise en
    cache peut cependant s'av&eacute;rer utile dans le cas o&ugrave; le fichier est
    situ&eacute; sur un montage r&eacute;seau). Les fournisseurs d'authentification
    bas&eacute;s sur SQL ou LDAP ont plus de chances de tirer parti de cette
    mise en cache, en particulier lorsqu'un probl&egrave;me de performances est
    d&eacute;tect&eacute;. <code class="module"><a href="../mod/mod_authnz_ldap.html">mod_authnz_ldap</a></code> g&eacute;rant son propre cache,
    seul <code class="module"><a href="../mod/mod_authn_dbd.html">mod_authn_dbd</a></code> est concern&eacute; par notre sujet.</p>
    <p>Les principales r&egrave;gles &agrave; appliquer pour la mise en cache sont :</p>
    <ol><li>Inclure le fournisseur pour lequel vous voulez effectuer une
    mise en cache dans une directive
    <code class="directive"><a href="#authncacheprovidefor">AuthnCacheProvideFor</a></code>.</li>
        <li>Mettre <var>socache</var> avant le fournisseur pour lequel
	vous voulez effectuer une mise en cache dans votre directive
	<code class="directive"><a href="../mod/mod_auth_basic.html#authbasicprovider">AuthBasicProvider</a></code>
	ou <code class="directive"><a href="../mod/mod_auth_digest.html#authdigestprovider">AuthDigestProvider</a></code>.</li>
    </ol>
    <p>Voici un exemple simple permettant d'acc&eacute;l&eacute;rer
    <code class="module"><a href="../mod/mod_authn_dbd.html">mod_authn_dbd</a></code> et utilisant dbm comme moteur de la
    mise en cache :</p>
    <pre class="prettyprint lang-config">    #AuthnCacheSOCache est optionnel. S'il est d&eacute;fini, il l'est pour
    #l'ensemble du serveur
AuthnCacheSOCache dbm
&lt;Directory "/usr/www/myhost/private"&gt;
    AuthType Basic
    AuthName "Cached Authentication Example"
    AuthBasicProvider socache dbd
    AuthDBDUserPWQuery "SELECT password FROM authn WHERE user = %s"
    AuthnCacheProvideFor dbd
    Require valid-user
    #Optionnel
    AuthnCacheContext dbd-authn-example
&lt;/Directory&gt;</pre>

</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="section">
<h2 id="dev">La mise en cache avec les modules tiers <a title="Lien permanent" href="#dev" class="permalink">&para;</a></h2>
    <p>Les d&eacute;veloppeurs de modules doivent savoir que la mise en cache
    avec <code class="module"><a href="../mod/mod_authn_socache.html">mod_authn_socache</a></code> doit &ecirc;tre activ&eacute;e dans leurs modules. La
    fonction de l'API <var>ap_authn_cache_store</var> permet de
    mettre en cache les donn&eacute;es d'authentification qu'un fournisseur
    vient de rechercher ou de g&eacute;n&eacute;rer. Vous trouverez des exemples
    d'utilisation &agrave; <a href="http://svn.eu.apache.org/viewvc?view=revision&amp;revision=957072">r957072</a>, o&ugrave; trois fournisseurs authn sont activ&eacute;s pour la mise
    en cache.</p>
</div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="directive-section"><h2 id="authncachecontext">Directive <span id="AuthnCacheContext">AuthnCacheContext</span> <a title="Lien permanent" href="#authncachecontext" class="permalink">&para;</a></h2>
<table class="directive">
<tr><th><a href="directive-dict.html#Description">Description:</a></th><td>Sp&eacute;cifie une cha&icirc;ne de contexte &agrave; utiliser dans la cl&eacute; du
cache</td></tr>
<tr><th><a href="directive-dict.html#Syntax">Syntaxe:</a></th><td><code>AuthnCacheContext directory|server|<var>custom-string</var></code></td></tr>
<tr><th><a href="directive-dict.html#Default">D&eacute;faut:</a></th><td><code>AuthnCacheContext directory</code></td></tr>
<tr><th><a href="directive-dict.html#Context">Contexte:</a></th><td>r&eacute;pertoire</td></tr>
<tr><th><a href="directive-dict.html#Status">Statut:</a></th><td>Base</td></tr>
<tr><th><a href="directive-dict.html#Module">Module:</a></th><td>mod_authn_socache</td></tr>
</table>
    <p>Cette directive permet de sp&eacute;cifier une cha&icirc;ne &agrave; utiliser avec le
    nom d'utilisateur fourni (et le domaine d'authentification - realm -
    dans le cas d'une authentification &agrave; base de condens&eacute;s) lors de la
    construction d'une cl&eacute; de cache. Ceci permet de lever l'ambigu&iuml;t&eacute;
    entre plusieurs noms d'utilisateurs identiques servant diff&eacute;rentes
    zones d'authentification sur le serveur.</p>
    <p>Il y a deux valeurs sp&eacute;ciales pour le param&egrave;tre : <code>directory</code>,
    qui utilise le contexte de r&eacute;pertoire de la requ&ecirc;te comme cha&icirc;ne, et
    <code>server</code>, qui utilise le nom du serveur virtuel.</p>
    <p>La valeur par d&eacute;faut est <code>directory</code>, qui est aussi la
    d&eacute;finition la plus courante. Ceci est cependant loin d'&ecirc;tre optimal,
    car par exemple, <var>$app-base</var>, <var>$app-base/images</var>,
    <var>$app-base/scripts</var> et <var>$app-base/media</var>
    poss&egrave;deront chacun leur propre cl&eacute; de cache. Il est pr&eacute;f&eacute;rable
    d'utiliser le fournisseur de mot de passe : par exemple un fichier
    <var>htpasswd</var> ou une table de base de donn&eacute;es.</p>
    <p>Les contextes peuvent &ecirc;tre partag&eacute;s entre diff&eacute;rentes zones du
    serveur, o&ugrave; les donn&eacute;es d'authentification sont partag&eacute;es. Ceci est
    cependant susceptible de cr&eacute;er des trous de s&eacute;curit&eacute; de type
    cross-site ou cross-application, et cette directive n'est donc pas
    disponible dans les contextes <var>.htaccess</var>.</p>

</div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="directive-section"><h2 id="authncacheenable">Directive <span id="AuthnCacheEnable">AuthnCacheEnable</span> <a title="Lien permanent" href="#authncacheenable" class="permalink">&para;</a></h2>
<table class="directive">
<tr><th><a href="directive-dict.html#Description">Description:</a></th><td>Active la mise en cache de l'authentification en tout
endroit</td></tr>
<tr><th><a href="directive-dict.html#Syntax">Syntaxe:</a></th><td><code>AuthnCacheEnable</code></td></tr>
<tr><th><a href="directive-dict.html#Context">Contexte:</a></th><td>configuration globale</td></tr>
<tr><th><a href="directive-dict.html#Status">Statut:</a></th><td>Base</td></tr>
<tr><th><a href="directive-dict.html#Module">Module:</a></th><td>mod_authn_socache</td></tr>
</table>
    <p>Normalement, cette directive n'est pas n&eacute;cessaire : l'activation
    est implicite si la mise en cache de l'authentification a &eacute;t&eacute;
    activ&eacute;e en tout autre endroit du fichier <var>httpd.conf</var>. Par
    contre, si cette mise en cache n'a pas &eacute;t&eacute; activ&eacute;e, par d&eacute;faut, elle
    ne sera pas initialis&eacute;e, et ne sera donc pas disponible dans un
    contexte de fichier <var>.htaccess</var>. Cette directive permet
    d'&ecirc;tre s&ucirc;r que la mise en cache a bien &eacute;t&eacute; activ&eacute;e et pourra
    donc &ecirc;tre utilis&eacute;e dans les fichiers <var>.htaccess</var>.</p>

</div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="directive-section"><h2 id="authncacheprovidefor">Directive <span id="AuthnCacheProvideFor">AuthnCacheProvideFor</span> <a title="Lien permanent" href="#authncacheprovidefor" class="permalink">&para;</a></h2>
<table class="directive">
<tr><th><a href="directive-dict.html#Description">Description:</a></th><td>Sp&eacute;cifie le fournisseur pour lequel on veut effectuer une
mise en cache</td></tr>
<tr><th><a href="directive-dict.html#Syntax">Syntaxe:</a></th><td><code>AuthnCacheProvideFor <var>fournisseur-authn</var> [...]</code></td></tr>
<tr><th><a href="directive-dict.html#Default">D&eacute;faut:</a></th><td><code>None</code></td></tr>
<tr><th><a href="directive-dict.html#Context">Contexte:</a></th><td>r&eacute;pertoire, .htaccess</td></tr>
<tr><th><a href="directive-dict.html#Override">Surcharges autoris&eacute;es:</a></th><td>AuthConfig</td></tr>
<tr><th><a href="directive-dict.html#Status">Statut:</a></th><td>Base</td></tr>
<tr><th><a href="directive-dict.html#Module">Module:</a></th><td>mod_authn_socache</td></tr>
</table>
    <p>Cette directive permet de sp&eacute;cifier un ou plusieurs fournisseurs pour
    le(s)quel(s) on veut effectuer une mise en cache. Les donn&eacute;es
    d'authentification trouv&eacute;es par un fournisseur non sp&eacute;cifi&eacute; dans une
    directive <code class="directive">AuthnCacheProvideFor</code> ne seront pas mises en
    cache.</p>

    <p>Par exemple, pour mettre en cache les donn&eacute;es d'authentification
    trouv&eacute;es par <code class="module"><a href="../mod/mod_authn_dbd.html">mod_authn_dbd</a></code> ou par un fournisseur
    personnalis&eacute; <var>mon-fournisseur</var>, et ne pas mettre en cache
    celles trouv&eacute;es par les fournisseurs l&eacute;gers comme file ou dbm :</p>
    <pre class="prettyprint lang-config">AuthnCacheProvideFor dbd mon-fournisseur</pre>


</div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="directive-section"><h2 id="authncachesocache">Directive <span id="AuthnCacheSOCache">AuthnCacheSOCache</span> <a title="Lien permanent" href="#authncachesocache" class="permalink">&para;</a></h2>
<table class="directive">
<tr><th><a href="directive-dict.html#Description">Description:</a></th><td>S&eacute;lectionne le fournisseur socache d'arri&egrave;re-plan &agrave;
utiliser</td></tr>
<tr><th><a href="directive-dict.html#Syntax">Syntaxe:</a></th><td><code>AuthnCacheSOCache <var>nom-fournisseur[:arguments-fournisseur]</var></code></td></tr>
<tr><th><a href="directive-dict.html#Context">Contexte:</a></th><td>configuration globale</td></tr>
<tr><th><a href="directive-dict.html#Status">Statut:</a></th><td>Base</td></tr>
<tr><th><a href="directive-dict.html#Module">Module:</a></th><td>mod_authn_socache</td></tr>
<tr><th><a href="directive-dict.html#Compatibility">Compatibilit&eacute;:</a></th><td>Les arguments optionnels du fournisseur sont disponibles
&agrave; partir de la version 2.4.7 du serveur HTTP Apache</td></tr>
</table>
    <p>Cette d&eacute;finition s'applique &agrave; l'ensemble du serveur et permet de
    s&eacute;lectionner un fournisseur pour le <a href="../socache.html">cache
    d'objets partag&eacute;s</a>, ainsi que des arguments &eacute;ventuels pour ce
    fournisseur. Les fournisseurs disponibles sont, entre autres, "dbm",
    "dc", "memcache", ou "shmcb", chacun d'entre eux n&eacute;cessitant le chargement
    du module appropri&eacute;. Si elle est
    absente, c'est la valeur par d&eacute;faut pour votre plate-forme qui sera
    utilis&eacute;e.</p>

</div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="directive-section"><h2 id="authncachetimeout">Directive <span id="AuthnCacheTimeout">AuthnCacheTimeout</span> <a title="Lien permanent" href="#authncachetimeout" class="permalink">&para;</a></h2>
<table class="directive">
<tr><th><a href="directive-dict.html#Description">Description:</a></th><td>D&eacute;finit une dur&eacute;e de vie pour les entr&eacute;es du cache</td></tr>
<tr><th><a href="directive-dict.html#Syntax">Syntaxe:</a></th><td><code>AuthnCacheTimeout <var>dur&eacute;e-de-vie</var> (secondes)</code></td></tr>
<tr><th><a href="directive-dict.html#Default">D&eacute;faut:</a></th><td><code>AuthnCacheTimeout 300 (5 minutes)</code></td></tr>
<tr><th><a href="directive-dict.html#Context">Contexte:</a></th><td>r&eacute;pertoire, .htaccess</td></tr>
<tr><th><a href="directive-dict.html#Override">Surcharges autoris&eacute;es:</a></th><td>AuthConfig</td></tr>
<tr><th><a href="directive-dict.html#Status">Statut:</a></th><td>Base</td></tr>
<tr><th><a href="directive-dict.html#Module">Module:</a></th><td>mod_authn_socache</td></tr>
</table>
    <p>La mise en cache des donn&eacute;es d'authentification peut constituer
    un trou de s&eacute;curit&eacute;, bien qu'un mise en cache de courte dur&eacute;e ne
    posera probablement pas de probl&egrave;me. En g&eacute;n&eacute;ral, il est conseill&eacute; de
    conserver les entr&eacute;es du cache de fa&ccedil;on &agrave; ce que la charge du serveur
    d'arri&egrave;re-plan reste normale, mais pas plus longtemps ;
    une dur&eacute;e de vie plus longue peut &ecirc;tre param&eacute;tr&eacute;e si les
    changements d'utilisateurs et de mots de passe sont peu fr&eacute;quents.
    La dur&eacute;e de vie par d&eacute;faut de 300 secondes (5 minutes) est &agrave; la fois
    raisonnable et suffisamment importante pour r&eacute;duire la charge d'un
    serveur d'arri&egrave;re-plan comme dbd (requ&ecirc;tes SQL).</p>
    <p>Cette dur&eacute;e de vie ne doit pas &ecirc;tre confondue avec la dur&eacute;e de
    vie de session qui est un tout autre sujet. Cependant, vous devez
    utiliser votre logiciel de gestion de session pour v&eacute;rifier si les
    donn&eacute;es d'authentification mises en cache peuvent allonger
    accidentellement une session, et en tenir compte lorsque vous
    d&eacute;finissez la dur&eacute;e de vie.</p>

</div>
</div>
<div class="bottomlang">
<p><span>Langues Disponibles: </span><a href="../en/mod/mod_authn_socache.html" hreflang="en" rel="alternate" title="English">&nbsp;en&nbsp;</a> |
<a href="../fr/mod/mod_authn_socache.html" title="Fran&ccedil;ais">&nbsp;fr&nbsp;</a></p>
</div><div id="footer">
<p class="apache">Copyright 2026 The Apache Software Foundation.<br>Autoris&eacute; sous <a href="https://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/quickreference.html">Directives</a> | <a href="https://cwiki.apache.org/confluence/display/httpd/FAQ">FAQ</a> | <a href="../glossary.html">Glossaire</a> | <a href="../sitemap.html">Plan du site</a> | <a href="https://bz.apache.org/bugzilla/enter_bug.cgi?product=Apache%20httpd-2">Signaler un bug</a></p></div><script><!--//--><![CDATA[//><!--
if (typeof(prettyPrint) !== 'undefined') {
    prettyPrint();
}
var langToggle = document.querySelector('.lang-toggle');
var topLang = document.querySelector('.toplang');
if (langToggle && topLang) {
    langToggle.addEventListener('click', function() { topLang.classList.toggle('open'); });
}
var qv = document.getElementById('quickview');
if (qv) {
    document.body.appendChild(qv);
    var qvBtn = document.createElement('button');
    qvBtn.className = 'qv-toggle';
    qvBtn.setAttribute('aria-label', 'Toggle page navigation');
    qvBtn.innerHTML = '&#9776;';
    document.body.appendChild(qvBtn);
    qvBtn.addEventListener('click', function() {
        var isOpen = qv.classList.toggle('open');
        if (isOpen) {
            qv.style.top = window.scrollY + 10 + 'px';
        }
    });
    window.addEventListener('scroll', function() { qv.classList.remove('open'); });
}
//--><!]]></script>
</body></html>