blob: 99eac94c9613dca8c2eed42c53743c56d8e11dca [file]
<!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_proxy_ftp - Serveur HTTP Apache Version 2.5</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.5</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.5</a> &gt; <a href="./">Modules</a></div>
<div id="page-content">
<div id="preamble"><h1>Module Apache mod_proxy_ftp</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_proxy_ftp.html" hreflang="en" rel="alternate" title="English">&nbsp;en&nbsp;</a> |
<a href="../fr/mod/mod_proxy_ftp.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>Module fournissant le support FTP &agrave;
<code class="module"><a href="../mod/mod_proxy.html">mod_proxy</a></code></td></tr>
<tr><th><a href="module-dict.html#Status">Statut:</a></th><td>Extension</td></tr>
<tr><th><a href="module-dict.html#ModuleIdentifier">Identificateur&nbsp;de&nbsp;Module:</a></th><td>proxy_ftp_module</td></tr>
<tr><th><a href="module-dict.html#SourceFile">Fichier&nbsp;Source:</a></th><td>mod_proxy_ftp.c</td></tr></table>
<h3>Sommaire</h3>
<p>Pour pouvoir fonctionner, ce module <em>requiert</em> le
chargement de <code class="module"><a href="../mod/mod_proxy.html">mod_proxy</a></code>. Il fournit le support du
mandatement des sites FTP. Notez que le support FTP est
actuellement limit&eacute; &agrave; la m&eacute;thode GET.</p>
<p>Ainsi, pour pouvoir traiter les requ&ecirc;tes FTP mandat&eacute;es,
<code class="module"><a href="../mod/mod_proxy.html">mod_proxy</a></code>, et <code class="module"><a href="../mod/mod_proxy_ftp.html">mod_proxy_ftp</a></code>
doivent &ecirc;tre charg&eacute;s dans le serveur.</p>
<div class="warning"><h3>Avertissement</h3>
<p>N'activez pas la fonctionnalit&eacute; de mandataire avant d'avoir <a href="mod_proxy.html#access">s&eacute;curis&eacute; votre serveur</a>. Les
serveurs mandataires ouverts sont dangereux non seulement pour
votre r&eacute;seau, mais aussi pour l'Internet au sens large.</p>
</div>
</div>
<div id="quickview"><h3>Sujets</h3>
<ul id="topics">
<li><img alt="" src="../images/down.gif"> <a href="#mimetypes">Pourquoi les fichiers du type
<var>xxx</var> ne sont-ils pas t&eacute;l&eacute;chargeables par FTP ?</a></li>
<li><img alt="" src="../images/down.gif"> <a href="#type">Comment puis-je forcer le t&eacute;l&eacute;chargement
FTP en mode ASCII du fichier <var>xxx</var> ?</a></li>
<li><img alt="" src="../images/down.gif"> <a href="#ftpnonget">Comment puis-je effectuer un
chargement FTP ?</a></li>
<li><img alt="" src="../images/down.gif"> <a href="#percent2fhck">Comment puis-je acc&eacute;der par FTP &agrave;
des fichiers situ&eacute;s en dehors de mon r&eacute;pertoire home ?</a></li>
<li><img alt="" src="../images/down.gif"> <a href="#ftppass">Comment puis-je dissimuler le mot de
passe FTP apparaissant en clair dans la ligne d'URL de mon
navigateur ?</a></li>
<li><img alt="" src="../images/down.gif"> <a href="#wildcard">Pourquoi re&ccedil;ois-je un listing de
fichiers alors que j'ai demand&eacute; le t&eacute;l&eacute;chargement d'un fichier
?</a></li>
</ul><h3 class="directives">Directives</h3>
<ul id="toc">
<li><img alt="" src="../images/down.gif"> <a href="#proxyftpdircharset">ProxyFtpDirCharset</a></li>
<li><img alt="" src="../images/down.gif"> <a href="#proxyftpescapewildcards">ProxyFtpEscapeWildcards</a></li>
<li><img alt="" src="../images/down.gif"> <a href="#proxyftplistonwildcard">ProxyFtpListOnWildcard</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_proxy_ftp">Probl&egrave;mes connus</a></li><li><a href="https://bz.apache.org/bugzilla/enter_bug.cgi?product=Apache%20httpd-2&amp;component=mod_proxy_ftp">Signaler un bug</a></li></ul><h3>Voir aussi</h3>
<ul class="seealso">
<li><code class="module"><a href="../mod/mod_proxy.html">mod_proxy</a></code></li>
</ul></div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="section">
<h2 id="mimetypes">Pourquoi les fichiers du type
<var>xxx</var> ne sont-ils pas t&eacute;l&eacute;chargeables par FTP ? <a title="Lien permanent" href="#mimetypes" class="permalink">&para;</a></h2>
<p>Ce type particulier de fichier n'est probablement pas d&eacute;fini en
temps que <code>application/octet-stream</code> dans le fichier
de configuration mime.types de votre mandataire. La ligne suivante
peut y rem&eacute;dier :</p>
<div class="example"><pre>application/octet-stream bin dms lha lzh exe class tgz taz</pre></div>
<p>Vous pouvez aussi utiliser la directive <code class="directive"><a href="../mod/core.html#forcetype">ForceType</a></code> pour d&eacute;finir par d&eacute;faut tous les types
de fichiers en tant que fichiers binaires :</p>
<div class="example"><pre class="prettyprint lang-config">ForceType application/octet-stream</pre>
</div>
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="section">
<h2 id="type">Comment puis-je forcer le t&eacute;l&eacute;chargement
FTP en mode ASCII du fichier <var>xxx</var> ? <a title="Lien permanent" href="#type" class="permalink">&para;</a></h2>
<p>Dans les rares siruations o&ugrave; vous devez t&eacute;l&eacute;charger un fichier
sp&eacute;cifique en utilisant la m&eacute;thode de transfert FTP
<code>ASCII</code> (alors que le mode transfert par d&eacute;faut est
<code>binary</code>), vous pouvez modifier le mode de transfert de
<code class="module"><a href="../mod/mod_proxy.html">mod_proxy</a></code> en suffixant la requ&ecirc;te avec
<code>;type=a</code> pour forcer un transfert en mode ASCII (les
listings de r&eacute;pertoires FTP sont cependant quant &agrave; eux transmis en
mode ASCII).</p>
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="section">
<h2 id="ftpnonget">Comment puis-je effectuer un
chargement FTP ? <a title="Lien permanent" href="#ftpnonget" class="permalink">&para;</a></h2>
<p>Actuellement, seule la m&eacute;thode GET est support&eacute;e pour FTP dans
<code class="module"><a href="../mod/mod_proxy.html">mod_proxy</a></code>. Vous pouvez par contre utiliser le chargement HTTP (POST
or PUT) via un mandataire Apache.</p>
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="section">
<h2 id="percent2fhck">Comment puis-je acc&eacute;der par FTP &agrave;
des fichiers situ&eacute;s en dehors de mon r&eacute;pertoire home ? <a title="Lien permanent" href="#percent2fhck" class="permalink">&para;</a></h2>
<p>Un URI FTP est consid&eacute;r&eacute; comme relatif au r&eacute;pertoire home de
l'utilisateur connect&eacute;. H&eacute;las, vous ne pouvez pas utiliser /../
pour atteindre des r&eacute;pertoires de niveau sup&eacute;rieur, car les points
sont interpr&eacute;t&eacute;s par le navigateur et ne sont donc pas vraiment
envoy&eacute;s au serveur FTP. Pour traiter ce probl&egrave;me, une m&eacute;thode
nomm&eacute;e <dfn>Squid %2f hack</dfn> a &eacute;t&eacute; impl&eacute;ment&eacute;e dans le
mandataire FTP Apache ; cette solution est aussi utilis&eacute;e par
d'autres serveurs mandataires courants comme le <a href="http://www.squid-cache.org/">Cache mandataire Squid</a>. En
pr&eacute;fixant par <code>/%2f</code> le chemin de votre requ&ecirc;te, vous
pouvez faire en sorte que le mandataire modifie le r&eacute;pertoire FTP
racine en <code>/</code> (au lieu du r&eacute;pertoire home). Par
exemple, pour extraire le fichier <code>/etc/motd</code>, vous
pourriez utiliser l'URL :</p>
<div class="example"><p><code>
ftp://<var>utilisateur</var>@<var>serveur</var>/%2f/etc/motd
</code></p></div>
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="section">
<h2 id="ftppass">Comment puis-je dissimuler le mot de
passe FTP apparaissant en clair dans la ligne d'URL de mon
navigateur ? <a title="Lien permanent" href="#ftppass" class="permalink">&para;</a></h2>
<p>Apache utilise diff&eacute;rentes strat&eacute;gies pour effectuer une
connexion &agrave; un serveur FTP &agrave; l'aide d'un nom d'utilisateur et d'un
mot de passe. En l'absence de nom d'utilisateur et de mot de passe
dans l'URL, Apache tente une connexion anonyme aupr&egrave;s du serveur
FTP comme suit :</p>
<div class="example"><p><code>
utilisateur : anonymous<br>
mot de passe : apache-proxy@
</code></p></div>
<p>Ceci fonctionne avec tous les serveurs FTP courants configur&eacute;s
pour accepter les connexions anonymes.</p>
<p>Pour une connexion personnalis&eacute;e avec un nom d'utilisateur
sp&eacute;cifique, vous pouvez int&eacute;grer ce dernier dans l'URL comme suit
:</p>
<div class="example"><p><code>
ftp://<var>nom-utilisateur</var>@<var>serveur</var>/mon-fichier
</code></p></div>
<div class="note"><h3>HttpProtocolOptions</h3>
<p>Par d&eacute;faut, la directive <code class="directive"><a href="../mod/core.html#httpprotocoloptions">HttpProtocolOptions</a></code> est d&eacute;finie &agrave;
<code>Strict</code>, ce qui a pour effet de rejeter les URLs contenant
des informations sur l&rsquo;utilisateur (nom ou mot de passe), en accord avec
la RFC 7230. Pour utiliser des donn&eacute;es d&rsquo;authentification dans les URLs
FTP, vous devez sp&eacute;cifier <code>HttpProtocolOptions Unsafe</code>.</p>
</div>
<p>Si le serveur FTP demande un mot de passe pour ce nom
d'utilisateur (ce qu'il est cens&eacute; faire), Apache va renvoyer au
client une r&eacute;ponse <code>401</code> (Autorisation requise), ce qui
fera afficher au navigateur une bo&icirc;te de dialogue utilisateur/mot
de passe. Une fois le mot de passe saisi, la connexion est tent&eacute;e
&agrave; nouveau, et si elle r&eacute;ussit, la ressource demand&eacute;e est
pr&eacute;sent&eacute;e. L'avantage de cette proc&eacute;dure r&eacute;side dans le fait que
votre navigateur n'affiche pas le mot de passe en clair, ce qu'il
aurait fait si vous aviez utilis&eacute; l'URL :</p>
<div class="example"><p><code>
ftp://<var>nom-utilisateur</var>:<var>mot-de-passe</var>@<var>serveur</var>/mon-fichier
</code></p></div>
<div class="note"><h3>Note</h3>
<p>Le mot de passe transmis de cette mani&egrave;re n'est pas chiffr&eacute;
lorsqu'il est envoy&eacute;. Il transite entre votre navigateur et le
serveur mandataire Apache sous la forme d'une cha&icirc;ne de texte en
clair cod&eacute;e en base64, et entre le mandataire Apache et le
serveur FTP en texte pur. Vous devez par cons&eacute;quent r&eacute;fl&eacute;chir &agrave;
deux fois avant d'acc&eacute;der &agrave; votre serveur FTP via HTTP (et d'une
mani&egrave;re g&eacute;n&eacute;rale avant d'acc&eacute;der &agrave; vos fichiers personnels via
FTP !) sur des canaux non s&eacute;curis&eacute;s, car des oreilles
indiscr&egrave;tes pourraient intercepter votre mot de passe au cours
de son transfert.</p>
</div>
</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="section">
<h2 id="wildcard">Pourquoi re&ccedil;ois-je un listing de
fichiers alors que j'ai demand&eacute; le t&eacute;l&eacute;chargement d'un fichier
? <a title="Lien permanent" href="#wildcard" class="permalink">&para;</a></h2>
<p>Apache examine l'URL de la requ&ecirc;te afin de permettre la
navigation dans les r&eacute;pertoires d'un serveur FTP ainsi que le
t&eacute;l&eacute;chargement de fichiers. Si elle ressemble &agrave; un r&eacute;pertoire, ou
contient des caract&egrave;res g&eacute;n&eacute;riques ("*?[{~"), alors Apache
consid&egrave;re que c'est un listing qui est demand&eacute;, et non un
t&eacute;l&eacute;chargement.</p>
<p>Vous pouvez d&eacute;sactiver le traitement sp&eacute;cial des noms contenant
des caract&egrave;res g&eacute;n&eacute;riques. Voir &agrave; cet effet la directive
<code class="directive"><a href="#proxyftplistonwildcard">ProxyFtpListOnWildcard</a></code>.
</p>
</div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="directive-section"><h2 id="proxyftpdircharset">Directive <span id="ProxyFtpDirCharset">ProxyFtpDirCharset</span> <a title="Lien permanent" href="#proxyftpdircharset" class="permalink">&para;</a></h2>
<table class="directive">
<tr><th><a href="directive-dict.html#Description">Description:</a></th><td>D&eacute;finit le jeu de caract&egrave;res des listings FTP
mandat&eacute;s</td></tr>
<tr><th><a href="directive-dict.html#Syntax">Syntaxe:</a></th><td><code>ProxyFtpDirCharset <var>character_set</var></code></td></tr>
<tr><th><a href="directive-dict.html#Default">D&eacute;faut:</a></th><td><code>ProxyFtpDirCharset ISO-8859-1</code></td></tr>
<tr><th><a href="directive-dict.html#Context">Contexte:</a></th><td>configuration globale, serveur virtuel, r&eacute;pertoire</td></tr>
<tr><th><a href="directive-dict.html#Status">Statut:</a></th><td>Extension</td></tr>
<tr><th><a href="directive-dict.html#Module">Module:</a></th><td>mod_proxy_ftp</td></tr>
<tr><th><a href="directive-dict.html#Compatibility">Compatibilit&eacute;:</a></th><td>D&eacute;plac&eacute;
depuis <code class="module"><a href="../mod/mod_proxy.html">mod_proxy</a></code> &agrave; partir de la version 2.3.5 d'Apache</td></tr>
</table>
<p>La directive <code class="directive">ProxyFtpDirCharset</code> permet de
d&eacute;finir le jeu de caract&egrave;res &agrave; utiliser pour les listings FTP en
HTML g&eacute;n&eacute;r&eacute;s par <code class="module"><a href="../mod/mod_proxy_ftp.html">mod_proxy_ftp</a></code>.</p>
</div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="directive-section"><h2 id="proxyftpescapewildcards">Directive <span id="ProxyFtpEscapeWildcards">ProxyFtpEscapeWildcards</span> <a title="Lien permanent" href="#proxyftpescapewildcards" class="permalink">&para;</a></h2>
<table class="directive">
<tr><th><a href="directive-dict.html#Description">Description:</a></th><td>Les caract&egrave;res g&eacute;n&eacute;riques dans les noms de fichiers
doivent-ils &ecirc;tre &eacute;chapp&eacute;s lorsqu'ils sont envoy&eacute;s au serveur FTP ?</td></tr>
<tr><th><a href="directive-dict.html#Syntax">Syntaxe:</a></th><td><code>ProxyFtpEscapeWildcards on|off</code></td></tr>
<tr><th><a href="directive-dict.html#Default">D&eacute;faut:</a></th><td><code>ProxyFtpEscapeWildcards on</code></td></tr>
<tr><th><a href="directive-dict.html#Context">Contexte:</a></th><td>configuration globale, serveur virtuel, r&eacute;pertoire</td></tr>
<tr><th><a href="directive-dict.html#Status">Statut:</a></th><td>Extension</td></tr>
<tr><th><a href="directive-dict.html#Module">Module:</a></th><td>mod_proxy_ftp</td></tr>
<tr><th><a href="directive-dict.html#Compatibility">Compatibilit&eacute;:</a></th><td>Disponible depuis la version 2.3.3 du serveur HTTP Apache</td></tr>
</table>
<p>La directive <code class="directive">ProxyFtpEscapeWildcards</code> permet
de d&eacute;terminer si les caract&egrave;res g&eacute;n&eacute;riques ("*?[{~") que contiennent
les noms de fichiers demand&eacute;s doivent &ecirc;tre &eacute;chapp&eacute;s pas un slash
invers&eacute; avant d'&ecirc;tre envoy&eacute;s au serveur FTP. Il s'agit du comportement
par d&eacute;faut ; cependant, de nombreux serveurs FTP n'ont aucune
connaissance de la notion d'&eacute;chappement, et tentent de servir le
fichier demand&eacute; sous sa forme litt&eacute;rale, en incluant les slashes
invers&eacute;s dans son nom.</p>
<p>D&eacute;finissez cette directive &agrave; "off" pour permettre le
t&eacute;l&eacute;chargement de fichiers dont les noms contiennent des caract&egrave;res
g&eacute;n&eacute;riques depuis des serveurs FTP qui ne connaissent pas
l'&eacute;chappement des caract&egrave;res g&eacute;n&eacute;riques.</p>
</div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="directive-section"><h2 id="proxyftplistonwildcard">Directive <span id="ProxyFtpListOnWildcard">ProxyFtpListOnWildcard</span> <a title="Lien permanent" href="#proxyftplistonwildcard" class="permalink">&para;</a></h2>
<table class="directive">
<tr><th><a href="directive-dict.html#Description">Description:</a></th><td>Les caract&egrave;res g&eacute;n&eacute;riques dans les noms de fichiers
demand&eacute;s doivent-ils d&eacute;clencher l'affichage d'un listing ?</td></tr>
<tr><th><a href="directive-dict.html#Syntax">Syntaxe:</a></th><td><code>ProxyFtpListOnWildcard on|off</code></td></tr>
<tr><th><a href="directive-dict.html#Default">D&eacute;faut:</a></th><td><code>ProxyFtpListOnWildcard on</code></td></tr>
<tr><th><a href="directive-dict.html#Context">Contexte:</a></th><td>configuration globale, serveur virtuel, r&eacute;pertoire</td></tr>
<tr><th><a href="directive-dict.html#Status">Statut:</a></th><td>Extension</td></tr>
<tr><th><a href="directive-dict.html#Module">Module:</a></th><td>mod_proxy_ftp</td></tr>
<tr><th><a href="directive-dict.html#Compatibility">Compatibilit&eacute;:</a></th><td>Disponible depuis la version 2.3.3 du serveur HTTP Apache</td></tr>
</table>
<p>La directive <code class="directive">ProxyFtpListOnWildcard</code> permet
de d&eacute;terminer si les caract&egrave;res g&eacute;n&eacute;riques ("*?[{~") que contiennent
les noms de fichiers demand&eacute;s provoquent l'affichage d'un listing de
fichiers par <code class="module"><a href="../mod/mod_proxy_ftp.html">mod_proxy_ftp</a></code> au lieu de t&eacute;l&eacute;charger un
fichier. Il s'agit de leur comportement par d&eacute;faut (valeur on).</p>
<p>D&eacute;finissez cette directive &agrave; "off" pour permettre le t&eacute;l&eacute;chargement de
fichiers m&ecirc;me si leur nom contient des caract&egrave;res g&eacute;n&eacute;riques.</p>
</div>
</div>
<div class="bottomlang">
<p><span>Langues Disponibles: </span><a href="../en/mod/mod_proxy_ftp.html" hreflang="en" rel="alternate" title="English">&nbsp;en&nbsp;</a> |
<a href="../fr/mod/mod_proxy_ftp.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>