• User Attivo

    Configurazione Apache e mod_rewrite

    Ciao, scusate se vi faccio una domanda molto complessa su un argomento molto semplice, ma ci ho passato la giornata senza capire un tubo.

    Con l'intento di scoprire le basi del mod_rewrite, ho creato un sito utilizzando un CMS modificato. Ho poi modificato il file .htaccess così (in altervista si può solo modificare via web e non fare l'upload via ftp):

    RewriteEngine on
    RewriteBase /
    RewriteRule ^(.*).htm$ xttp://cucinami.altervista.org/?$1

    Gli passo per esempio:
    xttp://cucinami.altervista.org/Contorni.htm
    e mod_rewrite la traduce correttamente in:
    xttp://cucinami.altervista.org/?Contorni

    OK. Funziona, anche se non ho le idee particolarmente chiare... perchè secondo me non dovrebbe funzionare!
    Per esempio: cosa contiene esattamente la variabile $1?
    Non dovrebbe contenere "xttp://cucinami.altervista.org/Contorni.htm"?
    Ma allora perchè devo riscrivere l'URL nella RewriteRule? E che fine fa ".htm" in fondo?
    Credo di non aver capito proprio niente!

    Ma il vero problema non è questo. Vorrei far funzionare il CMS anche sul PC di casa, abilito il mod_rewrite in Apache e... non funziona una cippa!

    Anzi, il mod_rewrite funziona perchè se uso:

    RewriteRule ^(.*).htm$ xttp://localhost/html/cucinami/3w/index.php?Contorni

    qualunque cosa gli passi mi fa vedere la pagina dei "contorni" ma, ogni volta che tento di passargli questa benedetta $1 ... Error 404 e peggio ancora non ho trovato un modo per capire esattamente cosa abbia tradotto il mod_rewrite.

    Osservazione: nella RewriteRule del PC locale ho dovuto mettere index.php perchè ho eliminato ogni nomefile da DirectoryIndex. Non è qui il problema.

    In conclusione, le domande sono queste:

    • Esiste un modo per vedere cosa traduce mod_rewrite per tentare di fare un minimo di debug?
    • C'è forse qualche altro modulo da abilitare nel server Apache?
    • C'è qualcuno che ha la pazienza di spiegarmi cosa contiene esattamente $1 e magari anche $2 $3 ...

    Se siete arrivati a leggere fino a qui... Grazie!


  • Super User

    ciao,
    in effetti i concetti che stanno alla base del mod rewrite non sono semplici provo a dipanare la matassa almeno in parte.

    partiamo da un url semplice:
    www.sito.it/pagina_descrizione_hotel.php?id=25

    questa url ha un parametro nella query string che non voglio che compaia come parametro e vorrei trasformarla in :

    www.sito.it/descrizione_25.htm

    per fare questo dovrò scrivere una regola nel file .htaccess e questa sarà:

    
    RewriteRule ^descrizione_([0-9]+).htm$ pagina.php?id=$1
    
    

    il carattere ^ indica che da questo punto in poi dovrà essere presa in considerazione la stringa url (ovvero tutto quello che c'è prima non mi interessa)

    definisco una stringa fissa "descrizione_" QUALCOSA DI VARIABILE ".htm" quindi questa regola entrerà in funzione quando si verificano queste condizioni ovvero, la parte di url che mi interessa comincia con "descrizione_" e termina con ".htm"

    quello che sta in mezzo a queste due stringhe è una parte variabile e come faccio a far capire ad apache che devo prendere la parte che sta in mezzo e portarla come parametro di una query string? usando il codice $x
    dove x è il numero progressivo delle parti variabili.

    nell'esempio che ho fatto c'è una sola parte variabile.

    
    RewriteRule ^descrizione_([0-9]+)_([0-9]+)_([0-9]+).htm$ pagina.php?id=$1&p2=$2&p3=$3
    
    

    Questa regola invece ha 3 parti variabili che vengono divise l'una dall'altra da un underscore (trattino basso).

    per recuperare e distinguere ognuno dei valori si userà ancora il codice $x ma questa volta come vedi c'è $1, $2, $3 che stanno a rappresentare la prima, la seconda e la terza occorrenza del codice ([0-9]+).

    spero di esserti stato utile.

    :ciauz:


  • User Attivo

    @Tymba said:

    spero di esserti stato utile.
    Utilissimo, finalmente ho capito cosa contengono esattamente $1 $2...

    Il mio problema era semplicissimo ed è stato risolto così:

    RewriteEngine on
    RewriteRule ^http://localhost/html/cucinami/3w/(.*).htm$ http://localhost/html/cucinami/3w/index.php?$1

    Mi resta un dubbio sul perchè su altervista funzioni anche l'altra sintassi...

    Ti ringrazio tantissimo.

    Buon anno a tutti


  • User Attivo

    @Tymba said:

    ciao,
    in effetti i concetti che stanno alla base del mod rewrite non sono semplici provo a dipanare la matassa almeno in parte.

    partiamo da un url semplice:
    www.sito.it/pagina_descrizione_hotel.php?id=25

    questa url ha un parametro nella query string che non voglio che compaia come parametro e vorrei trasformarla in :

    www.sito.it/descrizione_25.htm

    per fare questo dovrò scrivere una regola nel file .htaccess e questa sarà:

    
    RewriteRule ^descrizione_([0-9]+).htm$ pagina.php?id=$1
    
    

    il carattere ^ indica che da questo punto in poi dovrà essere presa in considerazione la stringa url (ovvero tutto quello che c'è prima non mi interessa)

    definisco una stringa fissa "descrizione_" QUALCOSA DI VARIABILE ".htm" quindi questa regola entrerà in funzione quando si verificano queste condizioni ovvero, la parte di url che mi interessa comincia con "descrizione_" e termina con ".htm"

    quello che sta in mezzo a queste due stringhe è una parte variabile e come faccio a far capire ad apache che devo prendere la parte che sta in mezzo e portarla come parametro di una query string? usando il codice $x
    dove x è il numero progressivo delle parti variabili.

    nell'esempio che ho fatto c'è una sola parte variabile.

    
    RewriteRule ^descrizione_([0-9]+)_([0-9]+)_([0-9]+).htm$ pagina.php?id=$1&p2=$2&p3=$3
    
    

    Questa regola invece ha 3 parti variabili che vengono divise l'una dall'altra da un underscore (trattino basso).

    per recuperare e distinguere ognuno dei valori si userà ancora il codice $x ma questa volta come vedi c'è $1, $2, $3 che stanno a rappresentare la prima, la seconda e la terza occorrenza del codice ([0-9]+).

    spero di esserti stato utile.

    :ciauz:

    se devo trasformare questo?
    http://www.nevel.it/shop/scheda.php?cod=32.12

    in questo:
    http://www.nevel.it/shop/scheda_3212.htm

    puo andare così?
    RewriteRule ^scheda([0-9]+).htm$ scheda.php?cod=$1


  • User Attivo

    Provo a risponderti per vedere se ho capito quello che ha detto Tymba.
    Se ho detto una scemata, editatemi il post o cancellatelo.

    Mi sono aiutato con [url=http://nanoweb.si.kz/manual/mod_rewrite.html]queste istruzioni e credo che nel tuo caso possa/debba essere:

    RewriteRule ^scheda_(.{2})(.{2}).htm$ scheda.php?cod=$1.$2

    forse per specificare che le stringhe da prendere sono formate da numeri si può fare cosi?

    RewriteRule ^scheda_([0-9]{2})([0-9]{2}).htm$ scheda.php?cod=$1.$2

    Se è una scemata, scusatemi e distruggete queso post.