• User

    Limiti .htaccess e mod rewrite di Apache

    Chi si occupa di seo e posizionamento sui motori di ricerca, avrà sicuramente ben presente tutte le possibilità che offre una consona configurazione del file .htaccess di Apache.

    Ora andremo ad analizzare nel dettaglio due possibili settaggi dello stesso che stanno particolarmente a cuore di ogni seo:

    • utilizzo del mod rewrite per riscrivere url rendendoli "spider friendly"
    • distinzione e eventuale redirect [301] degli url con o senza www

    Evito troppe parole e vado dritto al nocciolo della questione con un esempio pratico e l' intento di soddisfare entrambi i punti sopracitati unicamente tramite la configurazione (fatta di espressioni lineari) del file .htaccess:

    passo numero 1:
    www.google.it/index.php?pagina=001&categoria=004
    deve diventare:
    www.google.it/001/004.html

    quindi scrivero' nel file .htaccess quanto segue:
    RewriteEngine On
    RewriteRule ^([^/]+)/([^/]+).html index.php?pagina=$1&categoria=$2

    passo numero 2:
    www.google.it/001/004.html
    come qualsiasi altra pagina deve farmi un redirect [301] su:
    google.it/001/004.html

    quindi scrivero' nel file .htaccess quanto segue:
    RewriteCond %{HTTP_HOST} ^www.google.it$
    RewriteRule ^(.*)$ http://google.it/$1 [R=301,L]

    Il LIMITE di tale sistema è che facendo il 301 in qualsiasi pagina (tranne la home del dominio chiaramente) nel caso in cui ci sia (o non ci sia a seconda dei casi) il www necessariamente vengono persi i parametri che caratterizzavano l' url rewritato.

    Con entrambi le configurazioni attive richiamando questa pagina:
    www.google.it/001/004.html
    per forza di cose mi ritrovo il 301 invece che qui:
    google.it/001/004.html
    qui:
    google.it/index.php?pagina=001&categoria=004

    Le motivazioni sono evidenti, anche se forse non tutti i lettori avranno chiaro il mio post 🙂

    Dulcis in fundus... sono obbligato a gestire il redirect (www no-www) attraverso il php perchè .htaccess non riesce ad aiutarmi a tanto....

    ...che qualcuno mi smentisca....

    Cordialmente
    Alessio

    PS scrivere una regola per "ogni pagina del sito" da cui fare il redirect non è una soluzione ammissibile:)


  • Community Manager

    Grazie Alessio per questo topic 🙂

    😉


  • User Attivo

    @diliberto said:

    passo numero 1:
    www.google.it/index.php?pagina=001&categoria=004
    deve diventare:
    www.google.it/001/004.html

    quindi scrivero' nel file .htaccess quanto segue:
    RewriteEngine On
    RewriteRule ^([^/]+)/([^/]+).html index.php?pagina=$1&categoria=$2

    ..e se volessi chiamarla www.google.it/topolino/pippo.html?
    cosi spieghi bene a tutti le possibilità del mod-rewrite 🙂
    :ciauz:


  • User Attivo

    @diliberto said:

    RewriteEngine On
    RewriteRule ^([^/]+)/([^/]+).html index.php?pagina=$1&categoria=$2 Ok, fin qui ci siamo, è il più classico dei rewrite
    @diliberto said:

    passo numero 2:
    www.google.it/001/004.html
    come qualsiasi altra pagina deve farmi un redirect [301] su:
    google.it/001/004.html

    quindi scrivero' nel file .htaccess quanto segue:
    RewriteCond %{HTTP_HOST} ^www.google.it$
    RewriteRule ^(.*)$ http://google.it/$1 [R=301,L] Perfetto, ogni url richiamato col www viene dirottato sull'host senza www
    ...aspetta un momento!!
    Perchè ?

    • 'next|N' (next round)
      Re-run the rewriting process (starting again with the first rewriting rule). Here the URL to match is again not the original URL but the URL from the last rewriting rule. This corresponds to the Perl next command or the continue command from the C language. Use this flag to restart the rewriting process, i.e., to immediately go to the top of the loop.
      But be careful not to create an infinite loop!
    • 'chain|C' (chained with next rule)
      This flag chains the current rule with the next rule (which itself can be chained with the following rule, etc.). This has the following effect: if a rule matches, then processing continues as usual, i.e., the flag has no effect. If the rule does not match, then all following chained rules are skipped. For instance, use it to remove the .www'' part inside a per-directory rule set when you let an external redirect happen (where the .www'' part should not to occur!).Il Next che ci sta a fare? Perchè deve ri-eseguire il rewrite dopo il redirect?
      Quando arrivo sulla pagina google.it/001/004.html (senza WWW) viene reinterpretato htaccess (indipendentemente dal flag Next), che col rewrite mi restituisce il contenuto di google.it/index.php?pagina=001&categoria=004 ma non mi reindirizza a quest'url; o mi sbaglio?

    E il Chain? Perdonami, ma non ho tanto chiaro l'intento di questo flag.

    E poi quell'$1... ma non c'è nulla di cui fare il match nella Rewrite Rule, non è che $1 prende il match dalla regola precedente (grazie al flag )?

    Voglio dire, una regola così:

    RewriteCond %{HTTP_HOST} ^www.google.it/(.)$
    RewriteRule ^(.
    )$ http://google.it/$1 [R=301,L]

    magari spostando il NEXT alla regola di url rewriting, non va bene? Perchè?

    In ogni caso, per quale motivo devi eseguire questo troncamento del www, e soprattutto, com'è la situazione?
    Sei linkato con www? O è solo google che preferisce mostrare in serp il www in luogo dell'altro?
    Forse potrebbe aiutarti questo: http://www.giorgiotave.it/forum/google-sitemaps/14996-dominio-preferito.html
    Forse non c'entra nulla, io nel caso te lo suggerisco (anche perchè è abbastanza in topic)

    Ciao!


  • Super User

    bel topic 🙂

    pedro tu sai dirmi come fare il redirect 301 da domain.tld a www.domain.tld con wordpress, che di suo mette un .htaccess tipo questo:

    
    # BEGIN WordPress
    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php 
    </IfModule>
    
    # END WordPress
    
    

    te lo chiedo da assoluto GNUrante di mod_rewrite 🙂


  • Super User

    p.s. NC é
    'nocase|NC' (no case)
    This makes the Pattern case-insensitive, ignoring difference between 'A-Z' and 'a-z' when Pattern is matched against the current URL.


  • User Attivo

    @must said:

    bel topic 🙂 Concordo 🙂
    Aspetto però sempre la risposta di diliberto, la questione mi interessa e non poco!

    @must said:

    pedro tu sai dirmi come fare il redirect 301 da domain.tld a www.domain.tld con wordpress Bè, dovrebbe bastare modificare il file che crea wordpress in questo modo:

    
    # BEGIN WordPress
    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . **http://www.domain.tld**/index.php **[R=301,L]**
    </IfModule>
    
    # END WordPress
    
    

    Non ho mai provato, ma a occhio dovrebbe fungere.
    A meno che l'ora tarda non mi abbia obnubilato il cervelletto; fammi sapere se funziona 🙂

    @must said:

    p.s. NC é
    'nocase|NC' (no case)
    This makes the Pattern case-insensitive, ignoring difference between 'A-Z' and 'a-z' when Pattern is matched against the current URL. Uaz allora ho cannato in pieno :eheh:

    P.s. l'ideale sarebbe studiarsi per bene la documentazione, però diverse volte, soprattutto all'inizio, questo [url=http://www.ilovejackdaniels.com/mod_rewrite_cheat_sheet.png]bigino del mod_rewrite mi ha risparmiato parecchio tempo!


  • Super User

    @petro said:

    Non ho mai provato, ma a occhio dovrebbe fungere.
    A meno che l'ora tarda non mi abbia obnubilato il cervelletto; fammi sapere se funziona 🙂

    non funziona 🙂
    se vado su www.domain.tld/post/ mi rimanda a www.domain.tld/index.php (non ho provato altri url, quindi non so come si comporta negli altri casi possibili).


  • User

    Prima di tutto perdonate la lunga attesa prima di essermi fatto risentire e soprattutto perdonate la rapidità di questo reply (petro leggerò con calma quello che mi chiedi e ne riparleremo di sicuro) ora sono di frettissima...

    Fine settimana, lontano da internet ho riflettuto sulla questione, non mi capacitavo che apache non riuscisse a gestire una situazione simile e riflettendo sul problema ho avuto una piccola illuminazione sul modus operandi che ho testato esser corretto e funzionante prima ancora di rileggere questo topic e le vostre risposte.

    La soluzione al mio quesito iniziale è molto semplice: apache interpreta in maniera lineare le istruzioni contenute al suo interno, pertanto nel caso sopracitato è sufficiente eseguire il redirect [301] prima del rewriteengine.... banalmente invertendo l' ordine delle righe di istruzioni da me postate 😉

    Cordialmente
    Alessio


  • User

    petro:
    (No Case)
    Ha detto bene must, non fa differenza fra 'A-Z' e 'a-z'.
    Non prettamente indispensabile al funzionamento dell' esempio sopracitato 😉

    must:
    prova questo, dovrebbe funzionarti per tutte le pagine non solo per la home e fammi sapere
    RewriteCond %{HTTP_HOST} ^google.it
    RewriteRule ^(.*)$ http://www.google.it/$1 [L,R=301]


  • User Attivo

    @diliberto said:

    ...che qualcuno mi smentisca....

    Cordialmente
    Alessio

    PS scrivere una regola per "ogni pagina del sito" da cui fare il redirect non è una soluzione ammissibile:)

    Ciao,

    così dovresti salvare "capre e cavoli"

    RewriteEngine On
    RewriteRule ^([^/]+)/([^/]+).html index.php?pagina=$1&categoria=$2

    RewriteCond %{HTTP_HOST} ^www.localhost.it$
    RewriteCond %{QUERY_STRING} ^$
    RewriteRule ^(.*)$ http://localhost/$1 [R=301,L]

    RewriteCond %{HTTP_HOST} ^www.localhost.it$
    RewriteCond %{QUERY_STRING} ^(.)=(.)&(.)=(.)$
    RewriteRule ^.*$ http://localhost/%2/%4.html ? [R=301,L]


  • User Attivo

    scusate se mi intrufolo nella discussione ma volevo chiedervi come è possibile (se lo è) calcolare il "superlavoro" dovuto all'uso di .htaccess.
    si insomma è una manna dal cielo per i motori ma per il server (in hosting!) di un sito affollato credo di no, o sbaglio??


  • User Attivo

    @piccolosocrate said:

    scusate se mi intrufolo nella discussione ma volevo chiedervi come è possibile (se lo è) calcolare il "superlavoro" dovuto all'uso di .htaccess.
    si insomma è una manna dal cielo per i motori ma per il server (in hosting!) di un sito affollato credo di no, o sbaglio??

    Apache ha a disposizione un utile strumento di benchmark
    http://httpd.apache.org/docs/2.0/programs/ab.html

    con cui è possibile "stressare" il sito

    Ovviamente la situazione ideale per siti molto molto frequentati, specialmente se realizzati con cms complessi come Typo3, è comunque inserire le configurazioni che normalmente inseriremmo in .htaccess direttamente in httpd.conf e settare AllowOverride None (prestando attenzione alle differenze di sintassi e di funzionamento per quanto riguarda mod_rewrite)

    Teni comunque presente che il parsing di qualsiasi file php (in assenza di un sistema di caching del bytecode) generalmente comporta un overhead maggiore del parsing di .htaccess


  • User Attivo

    @fheller said:

    Apache ha a disposizione un utile strumento di benchmark
    http://httpd.apache.org/docs/2.0/programs/ab.html

    con cui è possibile "stressare" il sito

    Ovviamente la situazione ideale per siti molto molto frequentati, specialmente se realizzati con cms complessi come Typo3, è comunque inserire le configurazioni che normalmente inseriremmo in .htaccess direttamente in httpd.conf e settare AllowOverride None (prestando attenzione alle differenze di sintassi e di funzionamento per quanto riguarda mod_rewrite)

    Teni comunque presente che il parsing di qualsiasi file php (in assenza di un sistema di caching del bytecode) generalmente comporta un overhead maggiore del parsing di .htaccess
    quindi pesa più un php che un htaccess!
    corpo di mille balene!