• User Newbie

    Rewrite: Indirizzo con ? Nell'url

    Salve a tutti,

    prima di sottoporre il problema in titolo, premetto che ho fatto una ricerca all'interno di questo forum ma non ho trovato elementi utili alla soluzione.

    Ho un file .htaccess che contiene la seguente regola di riscrittura

     Codice:
     RewriteRule ^([^/]+)_([^/]+).html$ mostra_sezione.php?nome_sezione=$1&id_sezione=$2  
    

    In sostanza, dovrebbe uscire ( e funziona ) un url del tipo nome_sezione_id_sezione.html .

    Sorgono dei problemi quando all'interno della variabile nome_sezione compare un ?.
    Ad esempio, se la sezione si chiama "nome sezione?" , la regola sopra inserita non funziona, dato che il carattere ? non è interpretato, per l'appunto, come carattere testuale ma come carattere speciale; di conseguenza l'indirizzo si ferma all'elemento della stringa che lo precede.

    Sicuramente bisognerà utilizzare l'escape ? ; così ho letto da diverse parti.

    Quello che non riesco a capire, però, è dove inserirlo all'interno della regola di riscrittura.

    Chiedo scusa per la prolissità, ma ho cercato di illustrare nel modo più esaustivo possibile il problema, cercando di rispettare quando indicato nel regolamento del forum.

    Grazie a tutti per la disponib


  • Super User

    Dato che il ? dovrebbe essere uno solo (delimita la query string dal file) non so di preciso cosa accade mettendone due (non ho tempo di provare ora, magari un print_r($_GET) ti fa capire cosa accade)

    In genere si eliminano caratteri strani dagli indirizzi.. si tolgono le lettere accentate, figurati un punto interrogativo.
    Tra l'altro non è neppure una buona riscrittura: la forma è quella di un indirizzo dinamico.

    Io eliminerei proprio il carattere (dovresti avere una funzione che ripulisce le stringhe degli indirizzi).


  • User Newbie

    Intanto ti ringrazio per la risposta.

    La questione fondamentale è che non sono pratico di espressioni regolari e di htaccess.

    Ho letto in giro per la rete e ho provato a configurare un htaccess da solo, "raccapezzando" pezzi .

    Dovrei ripulire tramite una funzione php che ripulisce le stringhe dai caratteri speciali, tipo questa ```
    ereg_replace("[^A-Za-z0-9 ]

    
    Fondamentalmente il problema è questo:
    
    il sito che sto progettando è strutturato in contenuti associati a sottocategorie. Queste ultime sono a loro volta organizzate in categorie e in,  livello "madre", sezioni.
    
    Le pagine in php create sono:
    
    mostra_sezione.php >> mostra l'elenco delle sezioni di secondo livello associate a quella "Madre", passando per get l'alias della sezione e il suo id
    
    mostra_categoria >> mostra le sezioni di secondo terzo livello, passando gli stessi parametri di cui sopra
    
    mostra_lista_contenuti.php >> mostra i contenuti associati a una sezione di terzo livello, passando anche questa gli stessi parametri.
    
    contenuto.php >> riceve via get l'id del contenuto 
    
    il sito è realizzato in cinque lingue, ognuna delle quali risiede in una cartella, generando, quindi un url del tipo
    
    

    dominio.it/LINGUA/

    
    

    dominio.it/LINGUA/SEZIONE_MADRE/SECONDO_LIVELLO/TERZO_LIVELLO/titolo_contenuto

    
    

    mostra_sezione.php >> dominio.it/LINGUA/SEZIONE_MADRE

    mostra_categoria.php >> dominio.it/LINGUA/SEZIONE_MADRE/SEZIONE_SECONDO_LIVELLO

    mostra_lista_contenuti >> dominio.it/LINGUA/SEZIONE_MADRE/SEZIONE_SECONDO_LIVELLO/TERZO_LIVELLO

    I miei dubbi riguardano:
    
    1) il fatto dei caratteri speciali nel campo alias sezione
    
    2) se mettere un htaccess in ogni cartella delle 5 lingue o uno solo nella root principale
    
    3) come gestire i link, dato che feci una prova in questa direzione ma i link non funzionavano; credo che sia necessario qualche redirect 303, ma non so come fare.
    
    Ti ringrazio nuovamente

  • Super User

    I caratteri speciali non ci devono essere. Possono succedere varie porcate tipo conversione in entità HTML o %hex.

    Io mi son fatto una mia funzione (che mi tengo ben stretto.. ma se ne trovano in vari script: wordpress, ...) che funziona così:
    f("ABcdì") = abcdi

    Considera che quando ti prendi un URL tipo pagina.php?id=$1&titolo=$2, $2 (abcdi) lo butti via perchè non puoi tornare indietro (a ABcdì). Per caricare i dati, devi basarti sulla chiave primaria ($1)

    (questo era per rispondere a come rilavorare la stringa dopo averla presa: non va proprio presa)

    Domanda interessante. Io faccio come mi torna più comodo (a volte in una cartella devo ridefinire qualcosa o fare qualcos'altro e quindi faccio .htaccess specifici per ogni cartella).
    Comunque è ininfluente (quando tutto funziona, almeno :D). Forse non per le prestazioni (bisogna vedere quanti utenti hai e fare delle prove).

    I link non funzionavano, cioè? 404? Che errore hai?
    Il redirect 301 serve per fare appunto.. un redirect da una pagina che non esiste più (esempio: pagina.php?$1,$2) verso la nuova ($1/$2.html)


  • User Newbie

    I caratteri speciali non ci devono essere. Possono succedere varie porcate tipo conversione in entità HTML o %hex.

    Io mi son fatto una mia funzione (che mi tengo ben stretto.. ma se ne trovano in vari script: wordpress, ...) che funziona così:
    f("ABcdì") = abcdi

    Considera che quando ti prendi un URL tipo pagina.php?id=$1&titolo=$2, $2 (abcdi) lo butti via perchè non puoi tornare indietro (a ABcdì). Per caricare i dati, devi basarti sulla chiave primaria ($1)

    (questo era per rispondere a come rilavorare la stringa dopo averla presa: non va proprio presa)

    Grazie.
    Proprio oggi ho cambiato un pò di script, impostando le query e i passaggi via get utilizzando solo il parametro id.

    Per quanto riguarda la funzione, pensavo di utilizzare questa qui:

    
    **function puliscistringa($stringa)
    {
    $stringa = str_replace("à", "a", $stringa);
    $stringa = str_replace("è", "e", $stringa);
    $stringa = str_replace("à", "a", $stringa);
    $stringa = str_replace("ì", "i", $stringa);
    $stringa = str_replace("ù", "u", $stringa);
    $stringa = ereg_replace("[^A-Za-z0-9 ]", "", $stringa );
    return $stringa;
    }
    **
    

    I link non funzionavano, cioè? 404? Che errore hai?
    Il redirect 301 serve per fare appunto.. un redirect da una pagina che non esiste più (esempio: pagina.php?$1,$2) verso la nuova ($1/$2.html)

    Si mi dava il 404, ma probabilmente era un'impostazione errata dei miei link.

    L'errore veniva generato nei link che facevano parte del menu top ( un menu sempre presente in tutte le pagine, configurato basandomi su una variabile di tipo $percorso_assoluto, configurata nel file config.php.)

    Un altro problema da considerare è che in una pagina ho anche un iframe ( sono stato costretto ).

    Insomma, un bel macello, soprattutto per chi, come me, è pochissimo tempo che ha scoperto l'uso del file htaccess e vorrebbe adattarlo a un cms realizzato in casa.

    comunque grazie, continuerò a romperti le scatole 😄


  • User Newbie

    Ho provato a seguire i tuoi consigli, sperimentandolo su una pagina specifica.

    la pagina

    mostra_categoria.php?alias_sezione=$alias_sezione&id_sezione=$id_sezione

    è diventata

    alias_sezione/categoria_id_sezione

    tramite questa regola nel file htaccess

    
    RewriteEngine On
    RewriteRule ^([^/]+)/categoria_([^/]+)$ mostra_categoria.php?alias_sezione=$1&id_sezione=$2 
    
    

    All'interno di questa pagina ci sono:

    1. comandi php include >> funzionano

    2. link ad altre categorie ( che passano ai link i valori alias2 e id_sezione2 per mostrare la relativa pagina)

    E' il punto 2 a darmi problemi.

    il link riscritto dovrebbe essere

    nome_dominio/alias_sezione2/id_sezione2

    invece la stringa me lo passa come

    nome_dominio/alias_sezione/alias_sezione2/categoria_id_sezione2

    in pratica la riscrittura crea una sottodirectory.

    Potrebbe funzionare se impostassi i link che richiamano la sezione 2 in questo modo

    ../alias_sezione2/categoria_id_sezione2 ?

    Grazie! 🙂


  • User Newbie

    credo di aver risolto la maggior parte dei miei problemi.

    erano dovuti tutti a una questione di link.

    adattandoli e utilizzando una variabile come percorso assoluto sembra che tutto funzioni. ( sgrrraaaat )

    grazie!