• User Attivo

    Posizionamento sito multilingua e sitemap

    Ciao ragazzi,
    un sito, o meglio, un insieme di siti sviluppati con una nostra piattaforma, stanno incontrando
    difficoltà a posizionarsi, anzi ad essere proprio indicizzati per l'inglese.
    In particolare vi riporto questo sito
    vacanze.net

    Questo sito è posizionato in italiano, ma l'inglese non viene proprio indicizzato da google.

    Sapete dirmi da cosa può dipendere?

    Ho letto un pò in giro che poteva essere conveniente inviare più sitemap per ogni lingua.
    E' corretto procedere così secondo voi?

    Grazie mille!
    Guido


  • Moderatore

    Ciao zseven,

    @zseven said:

    un sito, o meglio, un insieme di siti sviluppati con una nostra piattaforma, stanno incontrando
    difficoltà a posizionarsi, anzi ad essere proprio indicizzati per l'inglese.
    In particolare vi riporto questo sito
    vacanze.net

    Questo sito è posizionato in italiano, ma l'inglese non viene proprio indicizzato da google.

    Prima di tutto, invocando l'indirizzo vacanze.net/ il sito effettua un redirect 302 verso vacanze.net/it-IT (e poi un 301 verso /it-IT/); non ho modo di sapere se discriminate in base all'IP dell'utente, di sicuro il primo redirect non è influenzato dalla lingua impostata sul browser (header HTTP "accept-language"): con qualunque valore, o senza alcun valore di accept-language sono stato invariabilmente buttato sulla versione Italiana.
    Googlebot non esibisce l'header accept-language e a meno che non lo gestiate diversamente in base a user-agent (non ho controllato) o IP (non posso controllare), vedrebbe anch'esso la versione Italiana.

    Visitando il sito con uno spider le prime migliaia di pagine questi non ha trovato alcun link verso la versione Inglese. Stessa cosa capiterebbe a googlebot.
    La scelta di selezione della lingua è effettuabile dall'utente non con un normale link all'URL Inglese, ma con uno script di postback di ASP.NET, non seguibile dallo spider di Google.

    Anche esplorando con lo spider esplicitamente /vacanze.net/en-US/, lo spider della versione in Inglese non può vedere che la pagina principale, e tutti i link interni puntano alla versione Italiana degli URL.
    Perché? Ho indagato la stranezza e ho l'impressione gli URL interni siano generati nella versione Iglese solo in presenza di un cookie di nome "Lingua" valorizzato a "languagePref=en-US", altrimenti sono generati nella versione Italiana.
    Googlebot - e quasi tutti gli altri spider - non usa cookies e vede solo gli URL in Italiano.

    Puoi confermare tutte questi punti usano lo strumento "Visualizza come Google" dal tuo account di Google Webmaster Tools.
    Temo dovrete apportare qualche correzione alla vostra piattaforma.

    Spero d'esserti stato utile


  • User Attivo

    Ciao e grazie mille per la precisissima risposta!

    Come hai detto giustamente tu il reindirizzamento lo faceva, erroneamente, basandosi sul cookie creato in base alla cultura impostata e la session Lingua valorizzata (solo dopo il postback).

    Adesso abbiamo impostato che al caricamento iniziale il valore della Session dipende dalla Culture direttamente.
    Quindi così dovrebbe essere corretto.

    Abbiamo infatti provato a mettere a mano il valore per la culture come "en-US" e siamo stati portati correttamente nella sezione inglese.

    Puoi verificare anche tu se trovi errori adesso?

    Grazie mille!
    Guido


  • User Attivo

    Cavolo però se provo a generare la sitemap partendo da vacanze.net/en-US/ ed escludendo il pattern it-IT non mi trova nulla uffa...


  • Moderatore

    @zseven said:

    Adesso abbiamo impostato che al caricamento iniziale il valore della Session dipende dalla Culture direttamente.
    Quindi così dovrebbe essere corretto.
    googlebot non usa cookies, quindi non puoi fare affidamento su variabili di Session (non avresti a disposizione il cookie di sessione per ricostruire la Session associata al visitatore e ogni nuova richiesta dello spider risulterebbe una nuova sessione).

    Se accetti il mio modesto consiglio, la lingua corrente non dovresti salvarla in una variabile di Session, ma ricostruirla ogni volta dal formato dell'URL: se inizia con /it-IT/, sia "it-IT"; se inizia con "en-US" sia "en-US".
    In ASP.NET si tratta di parsare il valore della proprietà Request.RawUrl

    @zseven said:

    Puoi verificare anche tu se trovi errori adesso?
    L'ho esaminato velocemente con Visual SEO Studio (con e senza supporto ai cookies). Ci sono ancora problemi, alcuni nuovi.
    Adesso gli URL nella versione inglese comportano dei 404, perché hanno il prefisso /en-US/ ma il path è costruito con la versione Italiana.

    Dopo aver messo a posto le logiche di lingua corrente e generazione, ti consiglio di modificare anche lo switch di lingua perché usi dei link "veri", non i javascript di callback. Così forniresti allo spider del motore di ricerca un percorso per trovare anche i contenuti nell'altra lingua.

    Altro consiglio: cerca di testare il comportamento agli spider localmente prima di mandare in produzione, testando iterativamente le modifiche con lo strumento di SEO auditing di tua scelta.

    Spero d'esserti stato utile


  • User Attivo

    se ho capito bene tu hai anche ottime conosce di .net, quindi magari puoi aiutarmi nel sistemare questa situazione.

    Mi riallaccio al punto in cui mi parli dei link veri per lo switch della lingua.
    Ora sono dei LinkButton, in quanto al click è collegata la seguente Sub


    Sub CambiaCultura(ByVal sender As Object, ByVal e As EventArgs)
    
        Dim Pulsante As LinkButton
        Pulsante = CType(sender, LinkButton)
    
        Session("Lingua") = Pulsante.CommandArgument
        Dim aCookie As New HttpCookie("Lingua")
        aCookie.Values("languagePref") = Session("Lingua")
        aCookie.Expires = System.DateTime.Now.AddDays(21)
        Response.Cookies.Add(aCookie)
    
        Response.Redirect("/" & Pulsante.CommandName)
    
    End Sub
    

    Se ho ben capito mi suggerisci di renderli dei semplici "a href" e poi una volta nella directory "/en-US/" impostare qui il codice di assegnazione per la cultura?

    Io adesso uso i cookie e le session solo per mantenere lo stato impostato o riconosciuto dalla Culture di .NET.

    Nel Global.asax infatti ho questo codice iniziale per la determinazione ed il mantenimento della Culture


    Sub Session_Start(ByVal Sender As Object, ByVal E As EventArgs)
        If Not Request.Cookies("Lingua") Is Nothing Then
            Session("Lingua") = Server.HtmlEncode(Request.Cookies("Lingua")("languagePref"))
            'Response.Write(Request.Cookies("Lingua")("languagePref"))
    
        Else
    
            Session("Lingua") = Thread.CurrentThread.CurrentCulture.ToString
            Dim aCookie As New HttpCookie("Lingua")
            aCookie.Values("languagePref") = Session("Lingua")
            aCookie.Expires = System.DateTime.Now.AddDays(21)
            Response.Cookies.Add(aCookie)
    
        End If
    End Sub
    

    Ritieni che sia sbagliato?

    Ti ringrazio moltissimo per l'aiuto, spero di riuscire a risolvere con i tuoi aiuti!


  • Moderatore

    @zseven said:

    Se ho ben capito mi suggerisci di renderli dei semplici "a href" e poi una volta nella directory "/en-US/" impostare qui il codice di assegnazione per la cultura?
    Esatto.
    Puoi usare il controllo Hyperlink, ma probabilmente troverai più conveniente produrre te gli "A href", perché il controllo ASP.NET non ha conoscenza di come hai implementato l'URL rewriting.

    La tua soluzione attuale ha lacune non solo per gli spider, ma anche per utenti bipedi:
    Poni i casi in cui l'utente richieda un URL della versione Inglese arrivando da un link da motore di ricerca, o da bookmark, da link in e-mail. Non avrebbe né cookie di lingua né cookie di sessione, scatterebbe una nuova session e se il default è sull'Italiano non sarebbe servito correttamente. La sessione server potrebbe scadere tra una richiesta e l'altra...

    Un po' di codice nella Application.BeginRequest per gestire la culture corretta in base a Request.RawUrl ti permetterebbe di avere una soluzione più robusta.

    Inoltre miglioreresti l'esperienza utente allo switch di lingua:
    oggi hai un primo postback per processare il codice hai mostrato, e poi una seconda richiesta HTTP per via del redirect.

    Ciao


  • User Attivo

    Allora dovrei esserci riuscito, utilizzando i tuoi preziosissimi suggerimenti ma senza abbandonare la session in quanto mi costringeva a modificare tutte le piattaforma.

    Penso che questo ragionamento che ho impostato possa funzionare, te lo riporto di seguito così se mi dai un parere mi fa piacere.

    ** Dim LinguaDaURL As String

    Sub Application_BeginRequest(sender As Object, e As EventArgs)
    
        LinguaDaURL = Request.RawUrl.Substring(1, 5)
    
    End Sub
    
    Sub Application_AcquireRequestState(sender As Object, e As EventArgs)
    
        If HttpContext.Current.Session("Lingua") Is Nothing Then
            HttpContext.Current.Session("Lingua") = Thread.CurrentThread.CurrentCulture.ToString
        End If
    
            If HttpContext.Current.Session("Lingua") <> LinguaDaURL Then
                HttpContext.Current.Session("Lingua") = LinguaDaURL
            End If
    
    End Sub**
    

    Come puoi vedere prima mi vado a verificare come mi hai suggerito l'URL.
    Poi vado a gestire il caso successivamente assegnando la cultura del visitatore alla sezione, nel caso sia vuota, e verificando se corrisponde alla lingua dell'url.

    Così facendo restituisco sempre le url corrette in qualsiasi parte del sito si arrivi, e sono anche riuscito a recuperare l'intero sito per la sitemap, inglese compreso!

    Grazie mille!


  • Moderatore

    Stiamo andando un po' OT 😉

    OK, capisco tu abbia voluto tenere la lingua in Session per minimizzare le modifiche, e ti limiti a impostarla a ogni inizio richiesta.
    A colpo d'occhio direi:

    • occhio che a seconda di come hai impostato IIS e la sua versione, gli eventi BeginRequest e AcquireRequestState potrebbero scattare anche per risorse non .aspx (css, script, immagini, etc..)
    • robustezza: l'utente potrebbe chiedere un URL con RawUrl.Length minore di 6 (root, immagini, url scritto male, etc..) e il Substring causerebbe un'eccezione
    • robustezza: i caratteri da 1 a 5 potrebbero non rappresentare una Culture valida (immagini, url scritto male, etc..)

    Ciao


  • User Attivo

    hai ragione, ormai ti ho scritto proprio codice .net 😄

    Per quanto riguarda i possibile errori su immagini o altro ho verificato e sembra andare bene
    vacanze.net/images/logo.png
    Ci sono alcuni casi in cui generava errore, non li ho inclusi nel codice che ti ho scritto per non appensatire il post con altro codice inutile 😉

    Grazie mille, il tuo aiuto è stato preziozo, inoltre ho scaricato il tuo programma visual seo studio che approfondirò sicuramente!!