Un consiglio teorico e pratico su come sviluppare una parte di un blog

otto9due

Utente Attivo
22 Feb 2014
591
25
28
sto per iniziare a sviluppare un blog per il mio sito web. Ho più o meno progettato tutto, mi sn un secondino bloccato sul seguente punto:
Ho bisogno di avere, come nei più comuni blog, una pagina dove ci sará una piccola intro, con titolo immagine e una piccola parte del testo con il classico leggi tutto.. Poi la mia idea è quella di creare una pagina dinamica che in base all'id che gli passo in get (dalla pagina che raccoglie tutte le anteprime ) vada a caricare di volta in volta l'articolo richiesto. E fino a qui tutto ok, dove viene il problema? Esattamente quando ( per motivi seo ) vorrei di volta in volta modificare il link, facendo una cosa del genere [ www.miosito.it/blog/titoloarticolo.php ].
Vorrei che non si vedesse tutta quella cosa tipo id ecc.. E che l'utente digitando quel link arrivi all'articolo..

Qualche idea, ringrazio anticipatamente.
 
è un po' lungo da spiegare punto per punto a quest'ora ma in generale quel tipo di url si ottiene con l'uso congiunto del file .htaccess e di php. di solito l'url non termina in .php ma .html oppure nulla.
in pratica nel file htaccess intercetti i link trasformati e li riporti a quelli normali, solo che al posto di passare gli id passi il titolo poi con php dovresti risalire dal titolo all'id e poi quando hai l'id è tutto a posto. devi però avere titoli univoci, nel database assieme al titolo e all'id devi avere anche il titolo trasformato per l'url (niente spazi, niente accenti, ecc) altrimenti risalire all'id è impossibile.
non è chiarissimo lo so ma ho sonno :) magari domani posto un po' di codice
 
Si, se riuscissi a farmi avere un pó di codice su cui ragionare sarebbe ottimo. Ho intuito il procedimento ma ho comunque bisogno di un esempio per procedere. Grazie
 
allora diciamo che la maggior parte della magia la fa il file .htaccess, non sono un vero esperto ma nel tempo mi sono costruito il mio che per me funziona. assomiglia a qualcosa tipo questo

Codice:
RewriteEngine on
RewriteBase /
Options -Multiviews

RewriteRule ^(.*)\.html$ /index.php?l=$1 [QSA,L]

ora, la prima riga attiva la possibilità di dare istruzioni al server da questo file, la seconda e la terza sinceramente non so a cosa servano ma, per esempio, senza la terza riga il tutto non funziona su Aruba.

veniamo all'ultima riga che è quella che fa il lavoro vero e proprio
come vedi è in pratica un'espressione regolare che dice "raccogli tutto fra l'inizio della richiesta e .html", tutto quello che c'è scritto nell'url verrà salvato in un registro ($1) ad esempio se l'url è www.miosito.it/blog/titolo-articolo.html nel registro $1 ci sarà "blog/titolo-articolo". penso quindi che in questo caso l'istruzione dovrebbe essere

Codice:
RewriteRule ^blog/(.*)\.html$ /index.php?l=$1 [QSA,L]

in questo modo dentro a $1 ci sarà "titolo-articolo". la seconda parte dell'istruzione passa alla pagina index.php la variabile l impostata al valore del registro $1 e quindi titolo-articolo. ora nel php avrai a disposizione $_GET['l'] con il valore "titolo-articolo". da qua quello che c'è da fare è trovare "titolo-articolo" nel database e recuperare l'id dell'articolo. una volta che hai l'id dovresti sapere già come procedere. per fare questo c'è bisogno che ogni articolo oltre al titolo abbia quello che wordpress chiama slug e cioè il titolo trasformato in stringa per url e quindi senza maiuscole, spazi, accenti, punteggiatura e gli slug devono essere univoci altrimenti diventa impossibile capire a che articolo si fa riferimento quindi due titoli uguali avranno slug diversi esempio titolo-articolo, titolo-articolo-2 anche se i due articoli si chiamassero entrambi Titolo Articolo.
 
Se ho capito bene faccio generare nella pagina con le anteprime degli articoli un link simile a questo per ogni articolo:
Codice:
http://www.miosito.it/blog/articolo.php?id=10&linktitle=test-slug-titolo-articolo-prodotto-e-salvato-manualmente-da-me-nel-db

Poi nel htaccess piazzo questo:

Codice:
RewriteRule ^blog\/(.*)$ articolo.php?linktitle=$1
Ho capito bene?
In questo modo mi passo sia il titolo preformattato manualmente, che un id per caricare poi i restanti dati degli articoli..

Unica cosa che non capisco a questo punto è quel: [QSA,L]??
 
Ultima modifica:
no, mi sono spiegato male, cerco di rimediare

la pagina con le anteprime dovrebbe creare link tipo questo
Codice:
http://www.miosito.it/blog/test-slug-titolo-articolo-prodotto-e-salvato-manualmente-da-me-nel-db

e nell'htaccess
Codice:
RewriteRule ^blog\/(.*)$ articolo.php?linktitle=$1

poi in articolo.php avrai $_GET['linktitle'] che conterrà "test-slug-titolo-articolo-prodotto-e-salvato-manualmente-da-me-nel-db" e con questo trovi l'id nel database.

se invece vuoi passare anche l'id (cosa che faccio a volte) allora verrebbe un po' diverso

Codice:
http://www.miosito.it/blog/10/test-slug-titolo-articolo-prodotto-e-salvato-manualmente-da-me-nel-db

ho aggiunto l'id fra blog e il titolo della pagina
e htaccess:
Codice:
RewriteRule ^blog\/(.*)\/.*$ articolo.php?id=$1

dove passi solo l'id
oppure

Codice:
RewriteRule ^blog\/(.*)\/(.*)$ articolo.php?id=$1&&linktitle=$2

e passeresti alla pagina articolo.php sia il titolo che l'id
 
le sigle alla fine della riga servono per dire al server di fermarsi una volta eseguita la regola, perché potresti avere molte regole una dopo l'altra ma ognuna valida per un solo tipo di indirizzo così il server troverebbe quella corretta e smetterebbe la lettura una volta trovata, e per specificare che se ci sono variabili nell'url vanno passate, per esempio se l'url fosse questa
Codice:
www.miosoto.it/titolo-della-pagina.html?a=8
[CODE]

e hai un htaccess tipo
[CODE]
RewriteRule ^(.*)\.html$ /index.php?l=$1 [QSA,L]

in pratica il server creerebbe una url che sarebbe index.php?l=titolo-della-pagina&a=8 passando a index sia quello specificato dal registro $1 sia quello che veniva passato nella url originale e cioè a=8

detto questo ripeto che non sono un grande esperto e quindi non so bene cosa faccia ogni singola lettere scritta fra le quadre, so che funziona e non lo cambio mai :)
 
Scusa hai ragione $1 va a sostituire il gruppo tra parentesi tonde..
Lo proverò molto presto ed ovviamente ti farò sapere se è tutto ok. Per il momento non posso far altro che ringraziarti :)
Allego un'immagine che ho trovato sul web, in modo tale che chiunque cerca una soluzione a questo problema possa avere più chiaro lo schema. image.jpg
 
Sto provando e riprovando a far funzionare questo questo codice ma nulla..

ricapitolando vediamo cosa ho fatto magari ci vedi qualcosa tu..

ho fatto in modo che si generino link di questo tipo:

HTML:
http://www.miosito.it/blog/articoli/8/test-sef-articolo-titolo

poi ho inserito nel .htaccess :

Codice:
# Sef link articoli
RewriteRule ^articoli\/(.*)\/.*$ articolo.php?id=$1

Ma quando clicco sul link mi da questo:
Codice:
Not Found

The requested URL /blog/articoli/2/prova-articolo-sef was not found on this server.

Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.

come se non avesse alcuna efficacia.

E la cosa strana è che subito sopra ho questa che invece funziona..
Codice:
# Reindirizzamento index.php 

RewriteCond %{THE_REQUEST} ^.*/index.php 
RewriteRule ^(.*)index.php$ http://www.miosito.it/$1 [R=301,L]
Ho provato anche così:
Codice:
# Sef link articoli
RewriteEngine On
RewriteBase /blog/
RewriteRule ^articoli\/(.*)\/.*$ articolo.php?id=$1

Ultima prova, anche questa senza risultati..
Codice:
# Sef link articoli
RewriteEngine On
RewriteBase /blog/
RewriteRule ^articoli(.*)\/(.*)$ articolo.php?id=$1&&linksef=$2 [QSA,L]
 
Ultima modifica:
prova
Codice:
RewriteRule ^blog/articoli/(.*)/.*$ articolo.php?id=$1
sempre che articolo.php sia allo stesso livello del file htaccess altrimenti devi mettere davanti tutto il percorso
 
Stavo leggendo una guida che spiegasse questo..
Stasera appena torno provo questa tua variante.. Assieme ad altri che mi sn appuntato e ti faccio sapere. Grazie per ora [emoji41]



Saluti.
G.G.
 
Ora succede una cosa ancora strana.. seppure arriva al link, arriva ad una pagina completamente senza css, mentre se digito il link manualmente, quello originale: ( /blog/articoli/articolo.php?id=2 ) tutto si vede correttamente..
Come mai? qualcuno lo sa? C'è qualcosa che non sta funzionando correttamente?


Alla fine ho risolto così per quanto riguarda il. .htaccess:

Codice:
# Sef url articoli del blog
RewriteEngine On
RewriteBase /blog/articoli/
RewriteRule ^blog/articoli/(.*)/.*$ articolo.php?id=$1

Lo commento per chi dovesse averne bisogno in futuro:
RewriteEngine On -> ( attiva l'engine )

RewriteBase /blog/articoli/ -> da l'indirizzo base per (articolo.php?id=$1) si può usare quando la pagina da riscrivere si trova in una sottocartella come in questo caso. Per intenderci funziona allo stesso modo anche così:
Codice:
# Sef url articoli del blog
RewriteEngine On
RewriteRule ^blog/articoli/(.*)/.*$ /blog/articoli/articolo.php?id=$1
ma ho preferito usare il format di sopra.

L'ultima parte detta la la regola, ovvero nella prima parte a sinistra, ci indica il patter da cercare, nel mio caso il tipo di link che doveva localizzare era di tipo:
Codice:
http://www.miosito.it/blog/articoli/2/prova-articolo-sef
dove l'elemento che mi interessava era il 2 ( id per recuperare i dati nella pagina di destinazione )

e la seconda parte del comando indica invece l'effettivo link richiamato.. ovvero, stiamo dicendo al server quando intercetti questo tipo di richiesta, sappi che il link vero che ci sta sotto è quest'altro..
Spero possa servire a qualcuno in futuro ;)
 
Mi rispondo solo.. In pratica, i css e i js vanno importati come se in effetti la pagina si trovasse in quelle sottocartelle..
quindi nel mio caso ../../../file.css e non ../../file.css

mentre gli include php rimangono sempre con ../../

non so spiegarmi il motivo.. ma funziona così..

Grazie a tutti, in particolare @n1k4r0 che molto pazientemente mi ha saputo supportare e sopportare ;)
 
Ultima modifica:
in pratica quello che succede è che per il server sei nella cartella che gli passi con l'htaccess mentre per il browser sei nella cartella specificata nella url. per far funzionare css e js è sufficiente che dai il percorso partendo dalla root del sito così non ha importanza che url passi e quindi se il tuo css si trovasse nella cartella css all'interno della cartella blog dovresti chiamarlo in questo modo
Codice:
/blog/css/style.css
così facendo non ti servono tutti i ../ e il css funziona anche se cambi url.
stessa cosa per il js
 
Una piccola considerazione, ora non ricordo neanche se su joomla fosse così, ma quando scrivo invece
Codice:
www.miosito.it/blog/articoli/articolo.php?id=1
comunque mi porta alla pagina.

Questa cosa è normale o devo fare un redirect 301 o un altra rewrite al contrario per evitare che accada?


Saluti.
G.G.
 
Ultima modifica:
quel tipo di url funzionerà sempre, in effetti è la stessa che dai in pasto al server dal file htaccess, è normale che funzioni perché effettivamente è quella la url che ha un senso per il server, l'altra gliela devi tradurre con htaccess.
il fatto che funzioni non è un grosso problema perché se il sito non è ancora pubblicato solo tu sai come si compone e nessuno la vede mai perché vedono quella parlante, se invece il sito esisteva già col tempo quelle url spariranno dai vari motori di ricerca in favore delle nuove col vantaggio che comunque quelle vecchie funzionano sempre. diverso sarebbe se portassero a pagine 404 allora si dovresti fare dei 301 puntanti alle nuove pagine.
 
Ora succede una cosa ancora strana.. seppure arriva al link, arriva ad una pagina completamente senza css, mentre se digito il link manualmente, quello originale: ( /blog/articoli/articolo.php?id=2 ) tutto si vede correttamente..
Come mai? qualcuno lo sa? C'è qualcosa che non sta funzionando correttamente?


Alla fine ho risolto così per quanto riguarda il. .htaccess:

Codice:
# Sef url articoli del blog
RewriteEngine On
RewriteBase /blog/articoli/
RewriteRule ^blog/articoli/(.*)/.*$ articolo.php?id=$1

Lo commento per chi dovesse averne bisogno in futuro:
RewriteEngine On -> ( attiva l'engine )

RewriteBase /blog/articoli/ -> da l'indirizzo base per (articolo.php?id=$1) si può usare quando la pagina da riscrivere si trova in una sottocartella come in questo caso. Per intenderci funziona allo stesso modo anche così:
Codice:
# Sef url articoli del blog
RewriteEngine On
RewriteRule ^blog/articoli/(.*)/.*$ /blog/articoli/articolo.php?id=$1
ma ho preferito usare il format di sopra.

L'ultima parte detta la la regola, ovvero nella prima parte a sinistra, ci indica il patter da cercare, nel mio caso il tipo di link che doveva localizzare era di tipo:
Codice:
http://www.miosito.it/blog/articoli/2/prova-articolo-sef
dove l'elemento che mi interessava era il 2 ( id per recuperare i dati nella pagina di destinazione )

e la seconda parte del comando indica invece l'effettivo link richiamato.. ovvero, stiamo dicendo al server quando intercetti questo tipo di richiesta, sappi che il link vero che ci sta sotto è quest'altro..
Spero possa servire a qualcuno in futuro ;)

Una piccola ma fondamentale annotazione, sempre perchè mi sentivo responsabile per chi dovesse utilizzare questo sistema e prenda questo post come riferimento.
Nel post quotato ho detto di aver utilizzato la versione con il:
RewriteBase /blog/articoli/
In effetti questa soluzione l'ho dovuta modificare, tornando ad utilizzare la modalitá :
Codice:
# Sef url articoli del blog
RewriteEngine On
RewriteBase /
RewriteRule ^blog/articoli/(.*)/.*$ /blog/articoli/articolo.php?id=$1
Perchè ho scoperto usandoli che il "RewriteBase /"va impostato una sola volta e vale per tutti i link a seguire. Questo parametro difatti identifica la cartella della root nella quale giace il sito ( potreste averlo anche in una sottocartella ). Quindi se il vostro sito, come il mio è nella root principale scriverete:
"RewriteBase /" altrimenti "RewriteBase /sottocartella/altrasott/"




Saluti.
G.G.
 

Discussioni simili