Il servizio di hosting

Le pagine del nostro sito dovranno essere ospitate su un PC con un server web (es. Apache) che può essere per esempio il nostro PC di casa. Questa opzione non è molto conveniente per la manutenzione, la sicurezza, la bolletta dell'energia elettrica... ecc... e si preferisce invece usare lo spazio e i servizi messi a disposizione da un Fornitore: gratuitamente senza banner pubblicitari (es. Altervista), gratuitamente con banner pubblicitari (la maggior parte) o a pagamento (per siti professionali).
Questo vi fornirà anche un dominio a cui il vostro sito sarà raggiungibile, solitamente sarà un dominio di terzo livello, cioè con il nome del fornitore alla fine (es. biccari.altervista.org e non biccari.org). Un nome di dominio di secondo livello invece va solitamente pagato. Ci sono anche domini di secondo livello gratuiti (www.dot.tk) ma necessitano poi di un banner pubblicitario.

Come funziona un web server (Apache)

Quando tentiamo di visualizzare una pagina internet con il nostro browser, in pratica stiamo richiedendo al web server, tramite una richiesta HTTP, di spedirci una certa pagina. Il server risponderà, se la pagina esiste, rispedendo la pagina e una intestazione con varie informazioni (HTTP header block), tra cui il tipo MIME della pagina.
Se digitiamo solo il link verso una directory (come quando digitiamo http://biccari.altervista.org, in questo caso la directory radice del sito) il web server cercherà la pagina secondo certi criteri specificati nelle sue opzioni.
Solitamente cerca in ordine: index.html, index.htm, index.php
Un modo per non mostrare il nome della pagina è quello di far puntare i link a cartelle ove dentro si trovi un file del tipo index.html o simili.
Se non viene trovato nulla viene visualizzato l'errore 404 oppure si fa una lista dei file sul sito (dipende da come i gestori hanno configurato Apache. Di solito succede la prima cosa).
Se il file trovato ha estensione .php viene inviato al modulo PHP di Apache che lo processa e lo riinvia ad Apache stesso per essere inviato al Browser. Se il file non ha estensione .php il file viene spedito direttamente al Browser.

I vari comportamenti del Web Server Apache possono essere modificati dai file di sistema se siete gli amministratori altrimenti potete farlo con il supporto .htaccess (non sempre reso disponibile e, anche se disponibile, quasi mai con tutte le funzioni attive.)
esempio di .htaccess:
DirectoryIndex index.xhtml index.php
AddType application/x-httpd-php .xhtml

la pagina iniziale viene cercata come index.xhtml e poi come index.php le pagine processate dal modulo PHP sono quelle di default più quelle con estensione .xhtml

Se il file iniziale è .php allora l'intestazione non può avere la dichiarazione xml altrimenti il motore php non ci capisce nulla e dà errore. Per ovviare a questo inconveniente si inserisce l'intestazione xml con il comando echo di PHP:

<?php echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";?>

Quando il web server invia la pagina al browser (UA: user agent) invia anche il tipo MIME (MIME Content-Type header) della pagina. Per fare ciò si basa sull'estensione della pagina. Quindi nel caso .htm, .html, .php il MIME type inviato è "Content-type: text/html". Nel caso .xhtml, .xht è "Content-type: application/xhtml+xml".
Il browser analizza ed effettua il render della pagina in base al tipo MIME inviato dal server. (E non, come erroneamente spesso si pensa, in base al DOCTYPE della pagina.)

Come avrete notato su Internet è difficile trovare file con estensione .xhtml. Perché? Semplice, perché Internet Explorer non ha la possibilità di gestire i file con tipo MIME xhtml. Se quindi realizziamo una pagina scritta in XHTML e le diamo l'estensione, ad esempio, .html o, nel caso ci sia del codice, .php, questa viene interpretata come una pagina HTML! E quindi IE non ha problemi di sorta.
In questo modo però si tradisce lo spirito di XHTML. Perché scrivere in XHTML quando poi il codice prodotto viene visto come semplice HTML? L'XHTML non è un HTML scritto minuscolo e con qualche virgoletta! È chiaro che per codice molto semplice l'XHTML può essere visto veramente come un HTML con qualche accortezza di scrittura in più e basta. Ma si dimentica il parsing della pagina! Un documento visto come HTML sarà trattato con molto buonismo dal browser che ignorerà errori nella pagina. Se invece il MIME inviato è correttamente quello dell'XHTML il browser analizzerà la pagina in maniera severa bloccando il render al primo errore e segnalandolo!

Come facciamo quindi ad inviare il giusto MIME? Rinominare la pagina con estensione .xhtml o .xht non è una buona cosa dato che molti web server sono configurati in modo da non permettere la ricerca della pagina indice con le estensione dell'XHTML. Inoltre se proprio volessimo farlo rimarrebbe il problema che l'80% degli utenti di Internet , siccome usano IE, non potranno visualizzare il nostro sito e anzi gli verrà proposto di scaricare la nostra pagina come se fosse un qualsiasi file, per esempio come quando si scarica un pdf.
Risolvere il problema è comunque cosa facile. Diamo alla pagina estensione .html o .htm o .php. Ora cambiamo l'header inviato dal web server al browser. In particolare dobbiamo cambiare il Content-type dell'header.
Esistono vari metodi per farlo. Una di queste è inserire del codice PHP subito dopo l'intestazione xml della nostra pagina. Il seguente codice permette, a seconda del browser usato, di cambiare l'header inviato assiame alla pagina.

<?php $XHTML_OK= (int) 0;
   if ( strpos($_SERVER["HTTP_ACCEPT"],"application/xhtml+xml") ) $XHTML_OK=1;
   if ($XHTML_OK==1) {header("Content-type: application/xhtml+xml");} else {header("Content-type: text/html");};
?>

Infine nella sezione head della pagina, dobbiamo creare un meta-tag http-equiv per specificare il charset usato, ma solo nel caso in cui la pagina venga interpretata come semplice HTML (perché in questo caso viene ignorata l'intestazione xml).

<? if ($XHTML_OK==0) echo "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"/>\n"; ?>

Da notare che non è possibile forzare il tipo MIME usando un meta-tag http-equiv, che inserisce nell'HTTP header block le informazioni che desideriamo, perché prevale quello inviato dal web server (almeno credo).

Il W3C validator non invia alcun HTTP_ACCEPT e quindi se vogliamo che veda la nostra pagina con il tipo mime giusto basta aggiungere la condizione or strpos($_SERVER["HTTP_USER_AGENT"],"W3C_Validator"). Stesso discorso ad esempio per i motori di ricerca (per Google: or strpos($_SERVER["HTTP_USER_AGENT"],"Googlebot")).
Controllare il client tramite HTTP_USER_AGENT, soprattutto per i motori di ricerca, è sconsigliato perché può essere considerato un diversivo per ingannare questi ultimi (vedi questa referenza).

Spesso si ha la possibilità di personalizzare la pagina di "File Not Found", cioè il famoso errore 404 del protocollo HTTP. Questa procedura restituisce quindi una pagina creata da noi, solitamente una pagina che deve essere chiamata (a seconda delle impostazioni di Apache), not_found.html, not_found.php, ecc... Questo comporta la comparsa a video della nostra pagina personalizzata (dove ovviamente scriveremo una cosa del tipo: Errore 404. La pagina che stai cercando bla bla bla...) e l'invio, nell'header HTTP, del codice di pagina esistenze e correttamente inviata (status 200) e non, come uno si aspetterebbe, di pagina non trovata (status 404). Spesso questa cosa non crea problemi (a parte alcuni casi come il noto problema di verifica del sito da parte di Google Webmaster Tools). Per risolvere il problema basta correggere a mano l'header inviato con la pagina personalizzata di errore. Per farlo è sufficiente inserire nella pagina personalizzata di errore (dove si vuole ma solitamente in cima al file) la seguente riga di codice PHP:

not_found.php
<?php header("HTTP/1.1 404 Not Found"); ?>