• User Attivo

    mod_rewrite

    Ho imparato molte cose utili grazie a voi, le ultime sono state .htaccess, if modify, robots.txt... ma ora avrei bisogno di capire come fare a rinominare un file lato server ovvero come usare la funzione mod_rewrite.

    Come funziona questo mod_rewrite?


  • Super User

    ciao,
    puoi guardare [url=http://www.yourhtmlsource.com/sitemanagement/urlrewriting.html]qui o [url=http://www.google.it/search?q=mod_rewrite+.htaccess&start=0&start=0&ie=utf-8&hl=it&oe=utf-8&client=firefox-a&rls=org.mozilla:it-IT:official]qui

    :ciauz:


  • Super User

  • Community Manager

    Sole, ma hai capito come fare alla fine?


  • Super User

    ho qualche link interessante in ufficio... se mi ricordate lunedì li metto a disposizione 🙂


  • User Attivo

    @Rinzi said:

    ho qualche link interessante in ufficio... se mi ricordate lunedì li metto a disposizione 🙂

    magari in lingua italiana :sbonk:


  • Super User

    vediamo assieme un esempio semplice di .htaccess

    
    ErrorDocument 404 http://www.miosito.com/errore.htm
    
    #REGOLE PER MOD_REWRITE
    RewriteEngine on
    RewriteRule ^dir/(.*)/([0-9])_([0-9]+).htm$ miapagina.php?p1=$1&p2=$2&p3=$3
    
    
    

    la prima riga è abbastanza intuitiva, dice che in relazione ad un errore 404 (documento non trovato) deve essere inviato al client la pagina indicata ed in qusto caso http://www.miosito.com/errore.htm

    ora vediamo la seconda parte:

    il cancelletto è un semplice carattere di commento (utilissismo ovviamente)

    RewriteEngine on
    è una direttiva che attiva la funzione di mod_rewrite

    RewriteRule ^dir/(.*)/([0-9])_([0-9]+).htm$ miapagina.php?p1=$1&p2=$2&p3=$3

    è una regola ma ne possono essere create di differenti e più d'una.

    rewriterule è la parola chiave che indica l'inizio della regola

    la prima parte definisce l'url da verificare
    la seconda come convertirlo

    ^ definisce l'inizio della stringa da verificare
    $ definisce la fine della stringa da verificare

    ogni carattere scritto al di fuori delle parentesi tonde costituisce una costante e quindi sono elementi che devono essere presenti perchè il mod_rewrite riconosca la stringa e la converta

    gli elementi nelle tonde dicono di prendere la parte di stringa che sta in quella posizione e metterla in una variabile ad indice progressivo.

    nel nostro caso il primo elemento che incontriamo nelle tonde è:
    (.*)
    questo elemento è il più flessibile in quanto permette di intercettare una stringa alfanumerica e di lunghezza variabile.

    gli altri elementi che sono presenti nell'esempio sono:

    ([0-9]) dice di catturare un carattere soltanto e questo carattere deve essere compreso tra 0 e 9

    ([0-9]+) dice di catturare un numero variabile di caratteri ma devono essere tutti numerici.

    un esempio di url che verrà convertita con questa regola sarà:

    RewriteRule ^dir/(.*)/([0-9])_([0-9]+).htm$ miapagina.php?p1=$1&p2=$2&p3=$3

    http://www.miosito/dir/il-titolo-del-mio-articolo/1_5881252.htm

    le stringhe intercettate saranno:

    1. il-titolo-del-mio-articolo
    2. 1
    3. 5881252

    ora, diamo il via alla fantasia per trovare esempi più stimolanti :fumato:


  • Super User

    @EthanDane said:

    @Rinzi said:
    ho qualche link interessante in ufficio... se mi ricordate lunedì li metto a disposizione 🙂

    magari in lingua italiana :sbonk:

    magari... è in inglese... 😄
    **

    [url=http://tools.devshed.com/c/a/Web-Development/Module-mod-rewrite-Tutorial-Part-1/]tutorial MOD_REWRITE**


  • User Attivo

    ora comincia ad essermi tutto più chiaro.
    certo in inglese qualcosa può sfuggire ma grazie al mini tutorial di tymba le regole basi mi sono più chiare. Se dovessi rinominare pochi file potrei fare così:

    RewriteEngine on 
    RewriteRule ^http://www.dominio.it/moto-usate.php?regione=basilicata$ http://www.dominio.it/moto-usate-basilicata.php
    

    L'url vecchio compreso tra ^$ e quello nuovo, deveno essere scritti per intero con http://


  • Super User

    heheheh esattamente il contrario:

    
    RewriteEngine on
    RewriteRule ^moto-usate-(.*).htm$ moto-usate.php?regione=$1
    
    

    in questo modo tutte le pagine che si chiamano moto-usate-QUALCOSACHEVUOITU.htm verranno passate a moto-usate.php ed il parametro regione verrà valorizzato con quello che metti al posto di QUALCOSACHEVUOITU

    es:

    www.miodominio,com/moto-usate-basilicata.htm
    verrà passato a www.miodominio,com/moto-usate.php?regione=basilicata

    da notare l'estensione htm che fa apparire la pagina come statica quando in realtà è il risultato di una pagina php.
    questo "rinominare" le estensioni ovviamente non è obbligatorio ma visto che hai fatto 30 fai 32 facendo le cose per bene.

    p.s. ricordati che devi cambiare anche tutti i link che hai nel sito :fumato:


  • User Attivo

    menomale che mi era tutto chiaro altrimenti... :lol:
    grazie mille


  • Super User

    Riuppo, perchè bene o male sto cercando una cosa analoga...

    Allora io ho un url di tipo www.dominio.net/index.php?userid=1

    E vorrei trasformarlo in www.dominio.net/user/1.htm

    Se ho capito bene dovrei fare:

    RewriteEngine on
    RewriteRule ^/user/(.*).htm$ index.php?userid=$1

    giusto?

    unico problema è che ho già delle regole di rewrite di wordpress...

    BEGIN WordPress

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

    END WordPress

    E penso che vadano a cozzare, o sbaglio?

    Tantè che ho provato e non funzionava...


  • User Attivo

    Leggendo questa discussione mi è venuta invece una domanda più incasinata.

    Ammettendo di avere un URL del tipo www.miosito.it/news.php?news=$id

    Come faccio a fare in modo che nel .htaccess ci sia una richiesta di informazioni al db (prendere le informazioni relative alla news associata al numero $news) e riscrivere l'url in base alle informazioni prese?

    Per dirla stupida:

    ho la news 10 con titolo "Prova" e sezione "Forum"

    il link di ritorno dovrebbe essere quindi:

    www.miosito.it/news/Forum/Prova.html

    Spero di essere stato chiaro 😛

    Ho pensato a fare una cosa del tipo:

    RewriteEngine On
    RewriteRule ^news/([^/]+)/([^/]+)-([^/]+).html$ news.php?id=$2&sezione=$1&titolo=$3

    ma mi sembra bruttino anche se è il primo giorno che smanetto sul mod rewrite...


  • Super User

    ho provato a settare così:

    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php
    RewriteRule ^profilo/(.*).htm$ index.php?userid=$1
    </IfModule>

    ma non ottengo nulla da http://www.nomesito.net/profilo/1.htm

    che sbaglio?