Manuale · 3

Pagine e albero delle pagine

Struttura e URL

La home page è la radice dell’albero e ha l’URL /. Ogni altra pagina sta sotto una pagina madre; il suo URL è composto dagli slug: pagina webdesign sotto leistungen → /leistungen/webdesign.

  • Gli slug sono composti da a-z, 0-9, ., _, - e iniziano con una lettera o una cifra. Sotto la stessa pagina madre uno slug deve essere univoco.
  • Slug riservati direttamente sotto la home page: cms-admin, api, media, _assets, sitemap.xml, healthz, favicon.ico, robots.txt.

Più siti web

Un’installazione può gestire più siti web – ad esempio il sito aziendale e uno shop, oppure siti per marchi diversi. Ogni pagina radice nell’albero delle pagine è un sito web a sé con proprio albero delle pagine, menu principale (nav()), pagina 404, sitemap e cache delle pagine.

  • Creare: nell’albero delle pagine + Sito → nome e domini (uno per riga, ad es. shop.firma.de e www.shop.firma.de).
  • Icona del sito (favicon): nell’editor della home page, in Impostazioni → Sito → Icona del sito (favicon), scegli un’immagine dalla gestione file – idealmente un SVG o un PNG quadrato da almeno 180 × 180 px (così funziona anche come icona nella schermata Home dell’iPhone). Tutte le pagine del sito ricevono il relativo <link rel="icon">, e /favicon.ico restituisce l’icona. Se una pagina imposta un’icona propria nel campo Head, questa ha la precedenza. Nel template l’URL è disponibile come {{ site.favicon }}.
  • I domini di un sito esistente li modifichi nell’editor della sua home page in Impostazioni → Sito. Un dominio può appartenere a un solo sito. Schema, porta e percorso vengono rimossi al salvataggio (https://Shop.de:8443/x → shop.de).
  • Sito predefinito: le richieste tramite domini non associati a nessun sito – anche localhost o l’indirizzo IP del server – mostrano il sito predefinito. Si trova in cima all’albero delle pagine e porta il badge Predefinito.
  • In comune sono snippet, componenti, file CSS/JS, file, Collections e sorgenti REST. Un componente header può quindi funzionare su più siti; con {{ site.title }} o {% if site.id == 1 %} può differenziarsi per sito.
  • Visualizzare senza un dominio reale: il link del percorso in alto nell’editor aggiunge ?_site=<ID>. Gli amministratori connessi vedono allora questo sito – anche navigando oltre, finché non ne scelgono un altro. Per i visitatori il parametro non ha effetto, e un dominio corrispondente ha sempre la precedenza.
  • Testare in locale con un dominio proprio: inserisci in aggiunta un dominio sotto .localhost, ad es. shop.localhost. I browser indirizzano tutto ciò che sta sotto .localhost al tuo computer senza DNS e senza file hosts – http://shop.localhost:8080/ mostra allora questo sito, anche senza accesso, cioè come lo vedono i visitatori. La porta la indichi solo nell’indirizzo, non nei domini. Strumenti come curl non sempre risolvono .localhost da soli; lì aiuta curl -H "Host: shop.localhost" http://127.0.0.1:8080/.
  • Eliminare un sito: nell’editor della sua home page in Impostazioni. Tutte le pagine del sito vengono eliminate; per sicurezza devi digitarne il nome. Si può eliminare anche l’ultimo sito – dopo, ogni indirizzo restituisce la pagina 404 finché non ne crei uno nuovo.

Perché un dominio arrivi davvero a IllusionCMS, deve puntare al server tramite DNS ed essere registrato nel reverse proxy (vedi Funzionamento).

Siti multilingue

Ogni lingua è un albero di pagine a sé: un sottoalbero dello stesso sito (/en/…) o un sito separato con un proprio dominio (firma.de e firma.com). Indichi a IllusionCMS quale lingua ha un albero e quali pagine vanno insieme – a hreflang, sitemap e <html lang> pensa poi da solo.

Impostare la lingua: Nell’editor in Impostazioni → Lingua – un codice BCP 47 come de, en, fr, de-at o pt-br (sceglilo dall’elenco o digitalo liberamente). La lingua viene ereditata da tutte le sottopagine senza una propria: impostala una volta sul sito (home page) e una volta sulla home page di ogni sottoalbero linguistico, ad es. /en. Vuoto significa “eredita dall’alto”; l’indicazione accanto al campo mostra quale lingua vale al momento. Se nessuna pagina sopra ha una lingua, vale de. Nell’albero delle pagine, le pagine con una lingua propria mostrano un piccolo codice.

La pagina riceve automaticamente <html lang="…">; nei template la lingua è disponibile come {{ page.lang }}. Un lang= negli Attributi per <html> continua ad avere la precedenza; con l’aggiornamento a questa versione è stato copiato una volta nel campo Lingua.

Collegare le versioni linguistiche: Nella sezione Versioni linguistiche delle impostazioni → Collega… → cerca le pagine di tutti i siti per titolo, percorso o lingua e clicca su quella giusta. Sono in grigio le pagine nella stessa lingua, quelle già collegate e quelle la cui lingua è già presente nel gruppo – una pagina per lingua. Se la pagina scelta è già collegata ad altre versioni, IllusionCMS chiede se spostarla. L’elenco mostra lingua, titolo, percorso (per altri siti con il loro nome) e un link per aprirla. Scollega rimuove una versione, Esci dal gruppo rimuove la pagina attuale; se resta una sola pagina, il gruppo viene sciolto. Eliminare una pagina la scollega anche. Il collegamento usa la lingua salvata – dopo aver modificato il campo Lingua, salva prima.

Automatico non appena sono collegate almeno due versioni pubblicate:

  • hreflang: Nell’<head> c’è per ogni versione (anche per la pagina stessa) un <link rel="alternate" hreflang="en" href="https://firma.com/contact">. Gli indirizzi sono assoluti – tramite il primo dominio del rispettivo sito, senza dominio tramite l’indirizzo richiesto. Se il campo head della pagina contiene già propri tag rel="alternate" hreflang, IllusionCMS non ne emette. In più c’è hreflang="x-default": se tutte le versioni sono nello stesso sito (sottoalberi come / e /de), punta alla versione nella lingua di quel sito, altrimenti a quella nella lingua del sito predefinito (se esiste).
  • Sitemap: Ogni URL con versioni riceve voci xhtml:link con hreflang, anche nell’esportazione statica.

Le bozze non contano.

Selettore di lingua: translations() restituisce le versioni pubblicate della pagina attuale, ordinate per codice lingua, ciascuna con lang, title, url e current (la pagina stessa). Senza collegamenti l’elenco contiene solo la pagina attuale – il selettore può quindi stare nel layout e resta vuoto dove non c’è nulla da cambiare ({% if translations()|length > 1 %}). language_name(code) restituisce il nome della lingua nella lingua stessa:

<nav class="sprachen">
  {% for v in translations() %}
    {% if v.current %}<span aria-current="true">{{ language_name(v.lang) }}</span>
    {% else %}<a href="{{ v.url }}" hreflang="{{ v.lang }}" lang="{{ v.lang }}">{{ language_name(v.lang) }}</a>{% endif %}
  {% endfor %}
</nav>

Le versioni su un altro sito rimandano al suo dominio.

Menu per lingua: nav() restituisce sempre le sottopagine della home page del sito – su /en/… mostrerebbe il menu tedesco. lang_root() restituisce la home page dell’albero linguistico della pagina attuale: la pagina stessa o la più vicina sopra di essa con una propria Lingua; se non ce n’è nessuna, la home page del sito (anche nelle pagine di dettaglio catch-all e nell’anteprima). Così un unico layout condiviso costruisce per ogni lingua il menu giusto, link alla home compreso:

{% with start=lang_root() %}
<a class="logo" href="{{ start.path }}">{{ site.title }}</a>
<nav>{% for p in children(start.id) %}<a href="{{ p.path }}">{{ p.title }}</a>{% endfor %}</nav>
{% endwith %}

Se l’albero inglese sta sotto la home page tedesca (/en), attiva Nascondi nei menu su /en – altrimenti “English” compare nel menu tedesco. La pagina resta raggiungibile tramite il selettore di lingua. lang_root(12) restituisce l’albero linguistico della pagina 12.

Collections per lingua: Una Collection ha una lingua (schema → Lingua delle voci). Per più lingue crei Collections separate, ad es. blog (lingua de) e blog-en (en), e colleghi le voci nella finestra della voce in Versioni linguistiche – come per le pagine; la ricerca copre le voci delle altre Collections con una lingua. Salva prima le nuove voci. Se le Collections hanno una pagina di dettaglio (schema), anche le pagine di dettaglio ricevono hreflang e voci nella sitemap, e translations(post) restituisce le versioni di una voce:

{% with post=item("blog", "slug", route.slug) %}
  {% for v in translations(post) %}<a href="{{ v.url }}" hreflang="{{ v.lang }}">{{ language_name(v.lang) }}</a> {% endfor %}
{% endwith %}

Limiti:

  • IllusionCMS ricorda solo cosa va insieme. Non traduce nulla e non riconosce se una versione è obsoleta.
  • Le pagine si possono collegare solo a pagine, le voci solo a voci. Le voci di Collections senza lingua non si possono collegare.
  • nav() mostra sempre il menu principale del sito (sottopagine della home page); per i menu per lingua usa children(lang_root().id) (vedi sopra).
  • La lingua dell’interfaccia di amministrazione (in fondo al menu) non ha nulla a che fare con la lingua dei contenuti.

Spostare le pagine

Nell’albero delle pagine con il drag & drop:

  • sul bordo superiore di una pagina → inserisci prima,
  • sul bordo inferiore → dopo,
  • al centro → come sottopagina.

La home page non si può spostare, e una pagina non può finire nel proprio sottoalbero. Spostando una pagina cambia l’URL della pagina e di tutte le sottopagine – i link nell’HTML di altre pagine non vengono adattati automaticamente. Per i menu conviene quindi usare nav()/children() (vedi Template), che restituiscono i percorsi attuali.

L’albero delle pagine si può comprimere con la freccia nell’intestazione, se ti serve più spazio per l’editor.

Pubblicazione e bozze

  • Pubblicata – la pagina è raggiungibile pubblicamente.
  • Bozza – pubblicamente la pagina restituisce 404. Una bozza nasconde solo se stessa; le sottopagine pubblicate restano raggiungibili. Così puoi creare “cartelle” come /blog che non sono una pagina, mentre i loro articoli lo sono.
  • Se hai effettuato l’accesso vedi comunque le bozze: aggiungi ?preview=1 all’URL (ad es. /neue-seite?preview=1) oppure usa il link del percorso in alto nell’editor.
  • Link di anteprima per altri (ad es. clienti): nella scheda Impostazioni, in Link di anteprima → Validità (1, 7 o 30 giorni) → Crea link (viene copiato subito). Il link mostra la versione salvata della pagina e delle sue sottopagine senza accesso – anche come bozza, e nelle pagine Catch-All anche voci di Collection ancora in bozza (/blog/neuer-artikel?ic_preview=…; nel template preview è allora vero). Altre pagine non le apre. I motori di ricerca ricevono noindex, le statistiche non contano nulla, niente viene messo in cache. I link scaduti o revocati (cestino) mostrano “Anteprima scaduta”. In modalità remota il link nasce sul server e punta al suo indirizzo.

Impostazioni della pagina

Nella scheda Impostazioni dell’editor:

Impostazione Significato
Titolo Nome della pagina nell’albero delle pagine, nei menu (nav()) e valore predefinito per <title>.
Slug Parte dell’URL. Non modificabile per la home page.
Lingua Lingua dei contenuti come codice (de, en, fr, de-at …), ereditata dalle sottopagine senza una propria. Vuoto = eredita dall’alto; l’indicazione mostra quella ereditata. Vedi Siti multilingue.
Versioni linguistiche Collegare la stessa pagina in altre lingue – per hreflang, sitemap e selettori di lingua.
Titolo SEO <title> facoltativo, valutato come template – ad es. con il titolo dell’articolo del blog attuale. Vuoto = titolo.
Meta descrizione <meta name="description">, sintassi template consentita.
Immagine di anteprima Immagine per le anteprime dei link nei messenger e nei social network (og:image), idealmente 1200 × 630 px. Vale per tutte le sottopagine senza un’immagine propria – un’immagine sul sito (pagina radice) è quindi il valore predefinito per tutte le pagine.
Attributi per <html> / <body> Vengono emessi invariati, ad es. class="dark". Senza lang= IllusionCMS imposta lang dal campo Lingua; un lang= proprio qui ha la precedenza. Le importazioni da Webflow qui hanno bisogno di data-wf-page/data-wf-site.
Pubblicata vedi sopra
Nascondi nei menu La pagina manca in nav() e children(), ma resta pubblicata e raggiungibile – per note legali, privacy, pagine di ringraziamento, landing page. Con nav(true) o children(id, true) la recuperi comunque, ad es. per il menu del footer. Nell’albero delle pagine compare senza menu. Non per le home page.
Non elencare nella sitemap La pagina non compare in /sitemap.xml (pagine di ringraziamento, landing page).
noindex I motori di ricerca non devono inserire la pagina nell’indice. Imposta <meta name="robots" content="noindex"> e toglie la pagina dalla sitemap.
nofollow I motori di ricerca non devono seguire i link della pagina (<meta name="robots" content="nofollow">). Entrambi insieme danno noindex, nofollow.
Disattiva cache La pagina viene renderizzata di nuovo a ogni richiesta (vedi Cache).
Catch-All La pagina risponde anche a sottopercorsi inesistenti – base per le pagine dinamiche.

Anteprime dei link (Open Graph): ogni pagina riceve automaticamente og:title (titolo SEO), og:description (meta descrizione), og:url, og:site_name (nome del sito), og:type e twitter:card – con immagine di anteprima anche og:image con dimensioni e testo alternativo (dalla gestione file), allora come scheda grande. Gli indirizzi sono assoluti: tramite il primo dominio del sito, senza dominio tramite l’indirizzo richiesto. Se un tag è già presente nel campo Head o nell’HTML importato (Webflow porta i propri), non viene emesso due volte – così imposti ad es. un’immagine propria per gli articoli del blog di una pagina Catch-All:

{% if route.slug %}<meta property="og:image" content="https://www.firma.de{{ file(item("blog", "slug", route.slug).bild).url }}">{% endif %}

Archivia come MHTML (in fondo alla scheda) scarica la versione salvata della pagina come un unico file .mhtml – con CSS, immagini, font e favicon, anche da server esterni (ad es. Google Fonts). Chrome ed Edge lo aprono con un doppio clic, anche offline; Firefox e Safari non possono aprire MHTML. Pensato come istantanea da archiviare:

  • Niente script: nei file MHTML i browser non eseguono JavaScript, perciò gli script non vengono nemmeno inclusi. Slider, menu o contenuti caricati via JavaScript appaiono nello stato senza script.
  • Niente srcset: le immagini arrivano nella dimensione di src, srcset e <picture><source> vengono rimossi.
  • I file oltre 25 MB (ad es. video) e i file non raggiungibili restano fuori; la pagina continua allora a rimandare all’indirizzo originale.
  • Le modifiche non salvate nell’editor non sono incluse – salva prima.

Pagina 404 personalizzata

Ogni sito può avere una propria pagina di errore. Viene mostrata per tutti i percorsi non trovati – con stato 404 – e riceve il percorso richiesto come route.path.

  • Scegliere una pagina qualsiasi: nell’editor della home page in Impostazioni → Sito → Pagina 404. Puoi scegliere tra tutte le pagine di questo sito; la pagina scelta resta raggiungibile al proprio URL, ma manca nella sitemap. Le bozze vengono ignorate.
  • Automatico (predefinito): una pagina pubblicata con lo slug 404 direttamente sotto la home page.
  • Se non c’è né l’una né l’altra – o non c’è ancora nessun sito –, il CMS mostra una semplice pagina standard.

{{ not_found() }} in un template (ad es. nelle pagine di dettaglio) restituisce la stessa pagina 404.

Reindirizzamenti

In Reindirizzamenti (menu principale) reindirizzi indirizzi che non esistono più verso indirizzi esistenti – ad es. vecchi URL dopo il trasloco da Webflow o voci di una pagina Catch-All di cui hai cambiato la parte dell’URL (/blog/123 → /blog/mein-artikel).

  • Creare: Da (vecchio indirizzo – percorso o semplicemente incolla il vecchio URL), A (percorso o URL esterno; suggerimenti dall’albero delle pagine), tipo 301 permanente (predefinito, per i motori di ricerca) o 302 temporaneo.
  • I reindirizzamenti agiscono solo sugli indirizzi inesistenti – se sotto il percorso esiste una pagina, viene mostrata quella. Maiuscole/minuscole e una barra finale non contano; i parametri di query (?utm_source=…) vengono passati alla destinazione.
  • Automatici: se rinomini o sposti una pagina pubblicata, IllusionCMS crea reindirizzamenti dai vecchi indirizzi della pagina e di tutte le sue sottopagine (contrassegno auto). I reindirizzamenti esistenti verso il vecchio indirizzo vengono aggiornati anch’essi – non si creano catene.
  • Destinazione mancante contrassegna i reindirizzamenti la cui destinazione non è più una pagina.
  • Registro 404: sotto vedi quali indirizzi inesistenti vengono richiesti – quante volte, quando l’ultima volta e da dove (ad es. un vecchio link su Facebook). Reindirizza porta l’indirizzo nel modulo. Ignora non elimina: nasconde soltanto l’indirizzo, che passa con il suo contatore alla scheda Ignorati e non riappare come aperto con ulteriori richieste. Molte voci come /wp-login.php provengono da bot e possono essere ignorate. Se hai sbagliato, recupera l’indirizzo con Ripristina nella scheda Ignorati; Ignora tutti e Ripristina tutti agiscono sull’intero elenco. Gli indirizzi ignorati non compaiono nell’esportazione CSV.
  • Modificare in Excel (CSV): Esporta CSV (in alto a destra) scarica come CSV gli indirizzi aperti del registro 404 – prima i più frequenti, colonna A vuota – e sotto tutti i reindirizzamenti. Inserisci in A le destinazioni (un percorso come /neu o un URL), modifica se serve destinazioni o Stato (301/302) dei reindirizzamenti esistenti e ricarica il file con Importa CSV. L’abbinamento avviene tramite Da: le righe con destinazione creano o modificano reindirizzamenti, le righe senza destinazione restano aperte. Con Elimina i reindirizzamenti che mancano nel file o non hanno destinazione fai pulizia anche tramite il file. L’anteprima mostra ogni modifica e tutti gli errori (ad es. cicli, percorsi doppi, percorsi di pagine esistenti) – in caso di errori non viene applicato nulla. Excel: salva come CSV UTF-8; le colonne Tipo, Accessi, Ultimo e Provenienza servono solo come panoramica. Le celle che iniziano con =, +, - o @ ricevono un ' iniziale nell’export (anche per le collection) perché Excel non le esegua come formule; l’import lo rimuove.
  • Nell’esportazione statica i reindirizzamenti si trovano nel file .htaccess, nei bundle vengono trasferiti anch’essi.

robots.txt

Ogni sito ha automaticamente un /robots.txt che consente tutto ai motori di ricerca e rimanda alla sitemap:

User-agent: *
Allow: /

Sitemap: https://www.firma.de/sitemap.xml

Le regole personalizzate le inserisci nell’editor della home page in Impostazioni → Sito → robots.txt, ad es. Disallow: /intern/. Se manca una riga Sitemap:, viene aggiunta. Le singole pagine è meglio toglierle dall’indice con noindex – una pagina bloccata tramite robots.txt può comunque comparire nei risultati di ricerca, solo senza contenuto.

Sitemap

Sotto /sitemap.xml IllusionCMS genera automaticamente una sitemap di tutte le pagine pubblicate – senza la pagina 404 e senza le pagine con Non elencare nella sitemap o noindex. Le sottopagine delle bozze sono incluse (sono infatti raggiungibili). Le pagine di dettaglio dietro le pagine Catch-All (singoli articoli del blog) vengono aggiunte automaticamente se la pagina legge la propria voce come nell’esempio Catch-All tramite item("blog", "slug", route.slug): allora ogni voce pubblicata con slug non vuoto compare nella sitemap come /blog/<slug>, con la data di modifica della voce.


Statistiche dei visitatori

In Statistiche vedi quanti visitatori sono arrivati – con più siti per tutti insieme (predefinito; nell’elenco delle pagine il sito precede allora il percorso) o per uno selezionato –, quali pagine hanno visitato, da dove sono arrivati (dominio del link di provenienza o utm_source), da quali paesi (mappa del mondo con elenco) e con quale browser, sistema operativo e dispositivo – per oggi, 7 o 30 giorni, 12 mesi o un periodo personalizzato (Dal – al, al massimo tre anni), ciascuno con il confronto rispetto al periodo precedente di pari durata. Per periodi oltre tre mesi il grafico mostra mesi anziché giorni.

Come si conta: sul server, a ogni visualizzazione di pagina servita con successo (anche dalla cache) – senza cookie, senza JavaScript, senza servizi esterni. Non vengono contati bot e crawler, pagine precaricate (prefetch), l’anteprima e le tue visite finché hai effettuato l’accesso all’admin.

I visitatori unici vengono riconosciuti tramite un hash composto da indirizzo IP, identificativo del browser e un valore casuale rigenerato ogni giorno; quello vecchio viene eliminato. Gli indirizzi IP non vengono mai salvati, e il giorno dopo l’hash non è più attribuibile a nessuno. Per questo chi arriva in tre giorni diversi conta come tre visitatori giornalieri – il numero di visitatori di un periodo è la somma dei giorni. Provenienza, paese, browser, sistema operativo e dispositivo contano per visitatore e giorno, non per visualizzazione.

Download: la scheda Download mostra quale file è stato scaricato quante volte – vengono contate le richieste sotto /media/… di file come PDF, ZIP o documenti Office, anche tramite link diretti (ad es. da una newsletter; il sito si ricava dal dominio). Immagini, font e CSS/JS non contano mai, e nemmeno i file che una pagina incorpora (ad es. un PDF in un <iframe>). Per video e PDF che il browser carica a pezzi conta solo la prima richiesta. Come per le pagine sono esclusi bot, prefetch e le tue richieste da amministratore connesso; Visitatori conta i visitatori unici per file e giorno. I download non contano come visualizzazioni di pagina. Un download interrotto conta comunque – più preciso non si può senza singole richieste. Nell’esportazione statica non c’è alcun conteggio.

Paesi: durante il conteggio il server cerca l’IP negli elenchi pubblici di assegnazione dei cinque registri Internet (RIPE NCC, ARIN, APNIC, LACNIC, AFRINIC) – in locale, senza servizi esterni; viene salvato solo il codice del paese. Si tratta del paese di registrazione del blocco di indirizzi, di solito il paese del provider – con VPN, reti aziendali e alcuni operatori mobili differisce dalla posizione reale. Le città volutamente non ci sono. Gli elenchi (in tutto circa 45 MB) IllusionCMS li scarica subito dopo il primo avvio e poi ogni settimana nell’esecuzione notturna; lo stato lo vedi in Impostazioni → Sistema → Dati dei paesi. Lì puoi aggiornare subito, disattivare del tutto i paesi oppure – per server senza accesso a Internet – caricare a mano i file delegated-…-extended-latest. Se una sincronizzazione non riesce, restano i dati precedenti. Le visite prima della prima sincronizzazione non hanno paese.

Esporta CSV scarica tutti i valori giornalieri del periodo scelto (e del sito scelto o di tutti) – per ogni giorno una riga per il sito nel complesso, ogni pagina, ogni caratteristica (provenienza, browser, sistema operativo, dispositivo, paese) e ogni file scaricato (tipo Download), con visualizzazioni o download e visitatori. Il file si apre direttamente in Excel ed è adatto alle tabelle pivot; le caratteristiche contano solo visitatori.

Vengono salvati solo valori giornalieri; restano finché non li azzeri in fondo alla pagina. Le statistiche non fanno parte dei bundle. Se questo procedimento sia ammesso per il tuo sito senza consenso dipende dal caso specifico – è progettato per la minimizzazione dei dati, ma non sostituisce una consulenza legale; menzionalo nell’informativa sulla privacy.