Visualizzazione risultati 1 fino 4 di 4

Discussione: .htaccess Redirect a file php per processare il request_uri, es test.php/padre/figlio

  1. #1
    chrmar non è connesso Neofita
    Data registrazione
    10-04-2012
    Messaggi
    9

    Angry .htaccess Redirect a file php per processare il request_uri, es test.php/padre/figlio

    Ciao a tutti
    Ho girato parecchio prima di scrivere, sia sul forum che su internet (stackoverflow ecc), ho pure chiesto a un mio collega come fa lui a gestire gli URL per il suo CMS, la sua risposta mi è sembrata piuttosto ovvia, fatto sta che qualsiasi cosa ho provato non ha ancora funzionato come voglio io.
    Premessa, ho pensato che forse possa essere una configurazione particolare che su Altervista non è consentito fare. Siccome mi sto disperando, prima di continuare a impazzire e morire di veleno nel fegato, provo a chiedervi lumi.

    Mi spiego.
    Voglio rifare completamente il mio sito, e per fare questo sto cercando di crearmi un CMS decente (in realtà il mio scopo è proprio quello di farmi un CMS, e con questo rifarmi il sito). In pratica io vorrei che le pagine fossero gestite dinamicamente, quindi nel momento in cui uno naviga su sito.com/news/scoperta-l-acqua-calda, in realtà sta navigando su index.php (o altra pagina) che preleva la REQUEST_URI (/news/scoperta-l-acqua-calda), gestisce in questo caso news come padre (che sarà poi la tabella in cui cercare nel DB, e scoperta-l-acqua-calda come figlio che andrà a cercare nel DB come valore di riferimento. Quindi il mio valore di riferimento sarà l'URL.
    Questo solo per spiegarvi cosa sto cercando di fare. Non dovrei aver problemi a fare tutto questo, ma il mio problema è questo:

    Sono giorni che cerco di impostare l'htaccess per fare in modo che prenda tutto ciò che c'è dopo il primo slash (quindi sito.com/QUESTO/MA-ANCHE-QUESTO/E-QUESTO) lo rimandi a index.php/url... in modo da poterlo gestire. Ma non ci riesco.

    Continuo ad avere errori di Pagina non trovata, da parte di Altervista, e ho pensato che forse AV non permette di usare lo slash ma solo il ?, perchè con lo slash lui va a cercare una cartella, di default, anche se io gli sto dicendo di fare altro. Può essere questo? Perchè se è così allora vuol dire che non posso usare questo metodo su altervista.
    Se invece mi dite che dovrebbe funzionare, allora vi chiedo di aiutarmi a capire.

    Inizialmente lavoravo su /new/, poi ho pensato che potesse darmi problemi allora ho iniziato a lavorare in root /, ma ancora non ho risolto. Inizialmente lavoravo su index.php, ho pensato potesse dare problemi, ho provato quindi su test.php, ma non è cambiato

    Questo il mio htaccess attuale

    Codice:
    RewriteEngine on
    RewriteRule ^/(.*)$ /test.php/$1 [NC,L]
    Vi dico quello che ho già provato.
    Codice:
    RewriteRule ^(.*)$ /test.php/$1 [NC,L]
    (non funziona,errore 500, anche se metto RewriteBase /)
    RewriteRule ^/(.*)$ test.php/$1 [NC,L]
    (cambia nulla)
    La cosa interessante è che se cambio la RewriteRule cosi funziona (in parte)
    Codice:
    RewriteRule ^(\w+)$ /test.php/$1 [NC,L]
    (funziona)
    dico funziona in parte perchè quel \w+ mi prende solo una porzione di codice, la prima, senza barre, perche il W accetta tutti i caratteri alfanumerici (come dire a-z 0-9), quindi non le barre. Altrimenti dovrei fare:
    Codice:
    RewriteRule ^(\w+)/?(\w+)?/?(\w+)?/?$ /test.php/$1 [NC,L]
    In pratica tanti (\w+)/? quanti i figli che posso avere nell'url... Questo mi risolve il problema ma io non voglio fare cosi perchè so che si può fare piu facilmente. Anche perchè se per assurdo ho 10 figli dovrei mettere 10 volte quella regular exp il che mi da fastidio. Vorrei farlo in modo semplice e facile.
    Teoricamente questa regola
    Codice:
    RewriteRule ^/(.*)$ /test.php/$1 [NC,L]
    Dovrebbe funzionare, o almeno così fa il mio collega nel suo cms (che non c'entra nulla con altervista).
    Perciò non capisco quali siano i miei errori. Sbaglio la RewriteRule? E' altervista che impedisce in qualche modo di fare come voglio io?

    Vi chiedo perchè sono sicuro che debba funzionare, mi ci sono massacrato i gioielli a cercare di risolvere, ma sto uscendo pazzo. Magari è una cosa banale di cui non mi accorgo, e quando me la direte dirò "Ah era così semplice".

    Grazie a tutti per il tempo e per la risposta.

  2. #2
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Il codice che produce l'errore 500 è quasi giusto, il problema è che, dopo aver riscritto l'URL, il nuovo URL è ancora "compatibile" con la regola di riscrizione, la quale viene quindi applicata ancora, ancora e ancora all'infinito. Questo produce un "internal server error: 500".

    Su Stackoverflow c'è una discussione simile. La soluzione consiste nell'escludere, nella parte di regola relativa al match, il nome della pagina target.

  3. #3
    chrmar non è connesso Neofita
    Data registrazione
    10-04-2012
    Messaggi
    9

    Predefinito

    Io penso però che se fosse così mi direbbe "Questa pagina non reindirizza in modo corretto".. Ma anche se fosse un errore 500, c'è qualcosa che non mi torna...

    Anche mettendo varie versioni di questo
    Codice:
    RewriteCond %{REQUEST_URI} !^index.php$
    RewriteRule /^(.*)$ /index.php/$1 [NC,L]
    Oppure al posto della condizione ho provato con
    Codice:
    RewriteRule ^index.php$ -
    Il risultato non mi cambia.
    Il mio obiettivo è avere www.sito.altervista.org/padre/nome-del-figlio. Non ci riesco e non capisco perchè.

    Ma la cosa curiosa è che se io faccio

    www.sito.altervista.org/index.php/padre/nome-del-figlio

    me lo processa correttamente e questo mi sembra che non abbia alcun senso.
    Allora ho provato appunto a fare in modo che index.php non rimandi a nulla oppure rimandi alla root (x prova) ma niente da fare.
    Eppure Altervista sa che deve prendere index.php come index, ho provato anche a forzarlo con DirectoryIndex index.php, ma comunque non risolvo nulla.

    Non capisco se sono io che sbaglio o se è AV che non mi permette di fare questa cosa. E' strano perchè mi sembra che Wordpress faccia una cosa simile (ho guardato l'htaccess di WP ma non ho trovato nulla di particolare)

    Grazie comunque intanto per la tua risposta

  4. #4
    chrmar non è connesso Neofita
    Data registrazione
    10-04-2012
    Messaggi
    9

    Predefinito

    Sono riuscito a svelare l'arcano
    Riflettendo su quello che mi dicevi, ci ho pensato un po' e ho indagato meglio su come funziona wordpress, visto che fa praticamente quello che voglio io.

    In pratica ho pensato che probabilmente Altervista quando non trovi un file o una directory ti da un suo errore con scritto Index mancante oppure Pagina non presente. Ho notato che un wordpress che funziona su altervista ha due regole in particolare che servono proprio a questo.
    Per dirla breve questo codice funziona

    Codice PHP:
    RewriteEngine On
    RewriteBase
    /test/ # (se sono in una sottocartella, altrimenti /)
    RewriteRule ^index\.php$ - [L] # Non agisco su index.php
    RewriteCond %{REQUEST_FILENAME} !-f # Se non trovo il file richiesto, es. /prova.php
    RewriteCond %{REQUEST_FILENAME} !-d # E se non trovo la directory richiesta, es /prova/abc/
    RewriteRule (.*) index.php/$1 [L] # Riscrivi tutto quello che c'è a partire dal RewriteBase e mandalo a index.php/valori/
    In questo modo ciò che scrivo dopo /test/, come ad esempio http://www.sito.com/padre/figlio/not...-dicembre-2016
    Verrà salvato e mandato a index.php/padre/figlio/notizia-11-dicembre-2016, che quindi sarà accessibile anche da sito.com/padre/figlio/notizia-11-dicembre-2016, per l'appunto, poichè per index.php sto rimandando al percorso di RewriteBase.
    Finalmente così funziona e posso usare $_SERVER['REQUEST_URI'] il quale conterrà ciò che scrivo dopo il primo /

    Grazie comunque per lo spunto di riflessione, spero di poter lasciare qui questo thread, magari qualcun'altro avrà i miei stessi dubbi.

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •