[{"data":1,"prerenderedAt":358},["ShallowReactive",2],{"article-\u002Fblog\u002Fdeployer-nuxt-statique-o2switch":3},{"id":4,"title":5,"body":6,"brouillon":344,"date":345,"description":346,"extension":347,"image":348,"imageAlt":348,"meta":349,"navigation":164,"path":350,"seo":351,"stem":352,"tags":353,"__hash__":357},"blog\u002Fblog\u002Fdeployer-nuxt-statique-o2switch.md","Déployer un site Nuxt 4 statique sur o2switch",{"type":7,"value":8,"toc":334},"minimark",[9,18,23,31,59,63,68,93,100,104,115,132,136,143,309,313,320,324,327,330],[10,11,12,13,17],"p",{},"o2switch est un hébergeur mutualisé cPanel très répandu dans l'écosystème\nfrancophone. Il n'est pas conçu pour les frameworks JavaScript modernes,\nmais un site Nuxt ",[14,15,16],"strong",{},"généré en statique"," s'y déploie très simplement : sans\nNode.js côté serveur, sans Passenger, sans maintenance.",[19,20,22],"h2",{"id":21},"pourquoi-le-statique","Pourquoi le statique",[10,24,25,26,30],{},"Pour un site vitrine ou un blog, la génération statique (",[27,28,29],"code",{},"nuxi generate",")\nproduit du HTML pré-rendu pour chaque page. Les bénéfices sont immédiats :",[32,33,34,41,47,53],"ul",{},[35,36,37,40],"li",{},[14,38,39],{},"SEO"," : Google reçoit du HTML complet, indexable instantanément.",[35,42,43,46],{},[14,44,45],{},"Performance"," : pas de rendu serveur, tout est servi comme des fichiers.",[35,48,49,52],{},[14,50,51],{},"Sécurité"," : aucune surface d'attaque applicative, pas de base de\ndonnées, pas de runtime, rien à patcher.",[35,54,55,58],{},[14,56,57],{},"Simplicité"," : le mutualisé sert des fichiers, c'est exactement son métier.",[19,60,62],{"id":61},"le-workflow","Le workflow",[64,65,67],"h3",{"id":66},"_1-générer-le-site-en-local","1. Générer le site en local",[69,70,75],"pre",{"className":71,"code":72,"language":73,"meta":74,"style":74},"language-bash shiki shiki-themes github-dark","npm run generate\n","bash","",[27,76,77],{"__ignoreMap":74},[78,79,82,86,90],"span",{"class":80,"line":81},"line",1,[78,83,85],{"class":84},"svObZ","npm",[78,87,89],{"class":88},"sU2Wk"," run",[78,91,92],{"class":88}," generate\n",[10,94,95,96,99],{},"Nuxt produit le site complet dans ",[27,97,98],{},".output\u002Fpublic\u002F"," : pages HTML, assets,\nsitemap, robots.txt.",[64,101,103],{"id":102},"_2-uploader-vers-o2switch","2. Uploader vers o2switch",[10,105,106,107,110,111,114],{},"Deux options : le gestionnaire de fichiers cPanel (zipper ",[27,108,109],{},".output\u002Fpublic",",\nuploader, extraire), ou un client FTP\u002FSFTP. La cible est le dossier\n",[27,112,113],{},"public_html\u002F"," de votre domaine.",[10,116,117,118,121,122,124,125,128,129,131],{},"Point important : uploadez ",[14,119,120],{},"le contenu"," de ",[27,123,98],{},", pas le\ndossier lui-même. ",[27,126,127],{},"index.html"," doit se retrouver directement à la racine de\n",[27,130,113],{},".",[64,133,135],{"id":134},"_3-configurer-le-htaccess","3. Configurer le .htaccess",[10,137,138,139,142],{},"Un fichier ",[27,140,141],{},".htaccess"," à la racine règle trois choses : la redirection\nHTTPS, la gestion des routes, et le cache des assets.",[69,144,148],{"className":145,"code":146,"language":147,"meta":74,"style":74},"language-apache shiki shiki-themes github-dark","RewriteEngine On\n\n# Forcer HTTPS\nRewriteCond %{HTTPS} off\nRewriteRule ^ https:\u002F\u002F%{HTTP_HOST}%{REQUEST_URI} [L,R=301]\n\n# Servir les pages pré-rendues (routes propres sans .html)\nRewriteCond %{REQUEST_FILENAME} !-f\nRewriteCond %{REQUEST_FILENAME} !-d\nRewriteRule ^(.*)$ \u002F$1\u002Findex.html [L]\n\n# Cache long pour les assets fingerprintés\n\u003CFilesMatch \"\\.(js|css|woff2|png|jpg|webp|svg)$\">\n  Header set Cache-Control \"public, max-age=31536000, immutable\"\n\u003C\u002FFilesMatch>\n","apache",[27,149,150,159,166,173,186,209,214,220,231,241,255,260,266,281,299],{"__ignoreMap":74},[78,151,152,156],{"class":80,"line":81},[78,153,155],{"class":154},"snl16","RewriteEngine",[78,157,158],{"class":84}," On\n",[78,160,162],{"class":80,"line":161},2,[78,163,165],{"emptyLinePlaceholder":164},true,"\n",[78,167,169],{"class":80,"line":168},3,[78,170,172],{"class":171},"sAwPA","# Forcer HTTPS\n",[78,174,176,179,183],{"class":80,"line":175},4,[78,177,178],{"class":154},"RewriteCond",[78,180,182],{"class":181},"sns5M"," %{HTTPS}",[78,184,185],{"class":88}," off\n",[78,187,189,192,195,198,202,206],{"class":80,"line":188},5,[78,190,191],{"class":154},"RewriteRule",[78,193,194],{"class":181}," ^",[78,196,197],{"class":88}," https:\u002F\u002F%{HTTP_HOST}%{REQUEST_URI}",[78,199,201],{"class":200},"s95oV"," [L,R=",[78,203,205],{"class":204},"sDLfK","301",[78,207,208],{"class":200},"]\n",[78,210,212],{"class":80,"line":211},6,[78,213,165],{"emptyLinePlaceholder":164},[78,215,217],{"class":80,"line":216},7,[78,218,219],{"class":171},"# Servir les pages pré-rendues (routes propres sans .html)\n",[78,221,223,225,228],{"class":80,"line":222},8,[78,224,178],{"class":154},[78,226,227],{"class":181}," %{REQUEST_FILENAME}",[78,229,230],{"class":88}," !-f\n",[78,232,234,236,238],{"class":80,"line":233},9,[78,235,178],{"class":154},[78,237,227],{"class":181},[78,239,240],{"class":88}," !-d\n",[78,242,244,246,249,252],{"class":80,"line":243},10,[78,245,191],{"class":154},[78,247,248],{"class":181}," ^(.*)$",[78,250,251],{"class":88}," \u002F$1\u002Findex.html",[78,253,254],{"class":200}," [L]\n",[78,256,258],{"class":80,"line":257},11,[78,259,165],{"emptyLinePlaceholder":164},[78,261,263],{"class":80,"line":262},12,[78,264,265],{"class":171},"# Cache long pour les assets fingerprintés\n",[78,267,269,272,275,278],{"class":80,"line":268},13,[78,270,271],{"class":200},"\u003C",[78,273,274],{"class":84},"FilesMatch",[78,276,277],{"class":88}," \"\\.(js|css|woff2|png|jpg|webp|svg)$\"",[78,279,280],{"class":200},">\n",[78,282,284,287,290,293,296],{"class":80,"line":283},14,[78,285,286],{"class":154},"  Header",[78,288,289],{"class":84}," set",[78,291,292],{"class":200}," Cache-Control \"public, max-age=",[78,294,295],{"class":204},"31536000",[78,297,298],{"class":200},", immutable\"\n",[78,300,302,305,307],{"class":80,"line":301},15,[78,303,304],{"class":200},"\u003C\u002F",[78,306,274],{"class":84},[78,308,280],{"class":200},[64,310,312],{"id":311},"_4-mettre-à-jour","4. Mettre à jour",[10,314,315,316,319],{},"Chaque mise à jour suit le même cycle : modifier le contenu, ",[27,317,318],{},"npm run generate",", re-uploader. Pas de base de données à migrer, pas de plugin à\nmettre à jour.",[19,321,323],{"id":322},"le-cas-du-formulaire-de-contact","Le cas du formulaire de contact",[10,325,326],{},"Un site statique n'a pas de serveur pour traiter un formulaire. Sur\no2switch, la solution la plus simple est un petit script PHP posé à côté du\nsite statique : le mutualisé exécute PHP nativement. Un honeypot (champ\ncaché que seuls les bots remplissent) suffit à filtrer l'essentiel du spam\nsans imposer de captcha aux visiteurs.",[10,328,329],{},"C'est l'un des rares cas où mélanger un site statique moderne et un script\nPHP de dix lignes est exactement la bonne solution : chaque outil fait ce\nqu'il sait faire.",[331,332,333],"style",{},"html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html pre.shiki code .sns5M, html code.shiki .sns5M{--shiki-default:#DBEDFF}html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}",{"title":74,"searchDepth":161,"depth":161,"links":335},[336,337,343],{"id":21,"depth":161,"text":22},{"id":61,"depth":161,"text":62,"children":338},[339,340,341,342],{"id":66,"depth":168,"text":67},{"id":102,"depth":168,"text":103},{"id":134,"depth":168,"text":135},{"id":311,"depth":168,"text":312},{"id":322,"depth":161,"text":323},false,"2026-07-01","Génération statique, upload cPanel, .htaccess : le workflow complet pour héberger un site Nuxt performant sur un mutualisé o2switch.","md",null,{},"\u002Fblog\u002Fdeployer-nuxt-statique-o2switch",{"title":5,"description":346},"blog\u002Fdeployer-nuxt-statique-o2switch",[354,355,356],"Nuxt","Déploiement","o2switch","WDq_W7WrrizKwhUIjb8QPFMRc3325ZlzaPZMVgZMmVo",1784652016702]