PROZONE powered by Tophost
  Home   Forum   Regolamento Help Login Registrati   *
Statistiche
Utenti
Utenti Totali: 1707
Ultimo utente: xal
Statistiche
Posts Totali: 29470
Topics Totali: 3404
Online Oggi: 51
Presenze Massime Online: 559
(23 Luglio 2008, 14:24:28)
Utenti Online
Utenti: 2
Visitatori: 43
Totale: 45
Siti amici
Design & Multimedia

Dire e Fare il blog che ti aiuta

Wordpress
Pagine: [1]
 
Autore Topic: Guida A Mod_rewrite (parte 4)  (Letto 13637 volte)
doGmaI
Utente Attivo
****
Posts: 280


Guida A Mod_rewrite (parte 4)
« il: 18 Luglio 2006, 12:48:59 »

Mi scuso innanzitutto con effe8 per il ritardo nella pubblicazione di questa ultima parte della guida
Inoltre, devo aggiungere, che causa nuovo lavoro non ho molto tempo libero (specie ora che devo fare stage e università Linguaccia) quindi questa quarta parte sarà leggermente "ridotta" rispetto alle intenzioni.
In particolar modo gli esempi sono davvero pochi (la parte delle "pagine amiche dei motori di ricerca è già stata fatta quindi un po' di esempi sono svaniti da questa sezione). Comunque cercherò, tempo permettendo, di aggiungere via via degli esempi in coda a questo "articolo"

Ultima parte di questa breve guida (non esaustiva) sul mod_rewrite di Apache.
In questo appuntamento vedremo qualche esempio di utilizzo "on the read" del mod_rewrite e qualche spiegazione conclusiva.
Passiamo subito all'azione quindi...

7.1. La RewriteCond
Un po' lasciata in disparte fino a questo momento, adesso analizzeremo in maniera un po' più approfondita la RewriteCond, istruzione fondamentale del modulo mod_rewrite (diciamo che la coppia RewriteCond + RewriteRule ci permette già di fare qualcosa di carino con il mod_rewrite).
Diciamo innanzitutto che la RewriteCond si comporta un po' come un semaforo, nel senso che se l'espressione (dopo vedremo come deve essere composta) è vera allora si esegue/eseguono le RewriteRule successive (fino al flag [L] o al termine del file in caso non ci sia altro dopo), altrimenti le istruzioni RewriteRule vengono saltate.
Grazie alla RewriteCond, possiamo quindi creare un solo file .htaccess che contiene però più "istruzioni" per il mod_rewrite e discriminare di volta in volta quale azione deve intraprendere mod_rewrite.
In conclusione quindi un file .htaccess "ben formato" (per quanto concerne le finalità di questa guida) ha la seguente struttura
Codice:
RewriteCond espressione1
RewriteRule1
RewriteRule2
RewriteRule...
RewriteRuleN [L]

RewriteCond espressione2
RewriteRule1
RewriteRule2
RewriteRule...
RewriteRuleN [L]

...

RewriteCond espressioneN
RewriteRule1
RewriteRule2
RewriteRule...
RewriteRuleN [L]

Una nota importante: ovviamente non c'è un limite al numero di RewriteCond (e quindi RewriteRule) che potete inserire nel file .htaccess. Va da se però che, come sempre in questi casi, il buon senso vi deve suggerire di non esagerare con le sezioni, altrimenti apache diventerà decisamente lento nel fare il parsing del file

7.2. La struttura della RewriteCond
Ora che abbiamo visto quale sia l'utilità della RewriteCond vediamo come utilizzarla
Il formato della RewriteCond è il seguente
Codice:
RewriteCond StringaDaTestare Pattern
dove StringaDaTestare è "il valore della variabile" che viene passata al mod_rewrite, mentre Pattern indica una condizione (tipicamente ancora con RegEx come abbiamo visto nella parte precedente della guida) che deve essere verificata affinchè le successive RewriteRule vengano eseguite.
Un esempio vale sicuramente più di mille parole percui...
Codice:
RewriteRule REQUEST_URI http:\/\/miosito\.it
se l'URL visitato dall'utente è http://miosito.it verranno eseguite le RewriteRule (non indicate nell'esempio)
Ora, cosa si può mettere come StringaDaTestare?
Alcune variabili predefinite sono le seguenti:
- REQUEST_URI: contiene l'URL richiesto dall'utente (insomma quello che viene digitato nella barra degli indirizzi del browser del visitatore)
- HTTP_USER_AGENT: contiene una stringa identificativa del browser usato dall'utente per visitare il sito (attenzione: la stringa che identifica un browser non è uno standard, ma ogni browser può presentarsi con una stringa diversa. A volte anche lo stesso browser ha delle stringhe identificative diverse a seconda della versione. Inoltre tenete presente che alcuni browser permettono di modificare la stringa con cui si identificano, percui non basatevi esclusivamente sulla HTTP_USER_AGENT per effettuare dei controlli sul programma usato dall'utente)
- REMOTE_ADDR: contiene l'indirizzo IP del visitatore
- REQUEST_METHOD: contiene la modalità usata per accedere alla pagina (es. GET, HEAD, POST, PUT)
- QUERY_STRING: contiene la parte "query" di un indirizzo (in poche parole quello che viene dopo il ?)
Sfruttando queste (e molte altre) variabili potete ad esempio:
- visualizzare una pagina diversa a seconda del browser utilizzato dall'utente (se si usa Internet Explorer 7 visualizzate la pagina con flash, immagini, suoni ecc ecc; se si usa un browser testuale con lynx potete reindirizzare il visitatore ad una pagina di solo testo, tipicamente più leggera da caricare) -> HTTP_USER_AGENT
- impedire ad un IP (o una classe di IP) di visitare il vostro sito (attenzione in questo caso a quali IP "bannate", potreste non ricevere più alcuna visita sul vostro sito perchè avete bannato il mondo intero) -> REMOTE_ADDR
- impedire che venga passato qualsiasi parametro alle vostre pagine php -> QUERY_STRING

8. Esempi conclusivi
Eccoci finalmente ad una rassegna di esempi per mettere in pratica tutto quello che abbiamo imparato sino ad ora

Esempio 1:
Vogliamo reindirizzare tutte le richieste index.html su index.php
Codice:
RewriteCond %{REQUEST_URI} ^/index.html
RewriteRule ^(.*)$ /index.php [L,NC]

Esempio 2:
Questa è una cosa che chiedono in molti, come realizzare una pagina personale per ogni utente iscritto.
NOTA: con mod_rewrite non è possibile fare dei veri e proprio domini di terzo livello (del tipo mionome.miosito.it), ma possiamo comunque realizzare qualcosa di decisamente più comodo da scrivere rispetto a www.miosito.it/utenti/pagine/personali/12312421.htm
Supponiamo quindi che nel nostro sito abbiamo una pagina login.php che accetta come parametro l'ID dell'utente. L'indirizzo sarebbe qualcosa del tipo www.miosito.it/login.php?ID=numero. Noi possiamo trasformarla in qualcosa del tipo www.miosito.it/ID.htm. Certo non è come un vero e proprio dominio di terzo livello, ma c'è comunque meno da ricordare (e quindi meno errori probabili)
Codice:
RewriteCond %{REQUEST_URI} ^([0-9]{8,8})\.htm
RewriteRule ^([0-9]{8,8})\.htm$ /login.php?ID=$1 [L,NC]
« Ultima modifica: 29 Maggio 2007, 08:55:56 da effe8 » Loggato

effe8
Coordinatore
*
Posts: 837


Guida A Mod_rewrite
« Risposta #1 il: 21 Luglio 2006, 18:41:07 »

Caro Dogmai, non devi proprio scusarti con nessuno, anzi! I contributi che vengono inviati a Prozone sono tutti apprezzati e nascono in modo del tutto spontaneo.

Grazie per aver inserito una nuova puntata della guida a mod_rewrite. :applausi:

Lurkatori del forum, che ne dite di registrarvi per esprimere il vostro ringraziamento a dogmai per il bel lavoro che ha fatto? Occhiolino

Oppure perche' non aggiungiamo a questa guida un po' di esempi personali con brevi didascalie di spiegazione? Dai, forza!
« Ultima modifica: 21 Luglio 2006, 18:42:53 da effe8 » Loggato

coolmann
Nuovo Utente
**
Posts: 29


Guida A Mod_rewrite
« Risposta #2 il: 20 Agosto 2006, 07:37:43 »

Uno dei possibili usi, citati nella guida qui sopra, è quello di BANNARE indirizzi IP non graditi. Questo è molto comodo: wordpress è in grado di segnalare (con il plugin akismet) lo spam nei commenti e da quale IP arriva. Se si nota che l'IP è sempre lo stesso o ricorre spesso, lo si può bannare per un periodo. Inoltre se accedi alla tua area di gestione sempre dai soliti IP (o da una rete fissa, ad esempio tiscali, alice, fastweb), si può anche restringere l'accesso alla pagina di login solo da quegli IP (se tu sei l'unico a pubblicare sul tuo blog, ad esempio). Ecco come è fatto il mio .htaccess

Codice:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

RewriteCond %{REQUEST_URI} ^/wp-login.* [OR]
RewriteCond %{REQUEST_URI} ^/wp-admin.*
RewriteCond %{REMOTE_ADDR} !^123\.456\.789\..*
RewriteCond %{REMOTE_ADDR} !^211\.112\.211\.112
RewriteRule . /index.php [L]
</IfModule>

# Filter unwanted spiders and spammers
deny from 208.66.195.0/28
deny from 195.225.177.46/32

Il primo gruppo dice che se il file (-f) o la cartella (-d) non esistono (il punto esclamativo che precede significa "non") allora reindirizza l'utente al file index.php (perché non mi piace mostrargli una pagina 404). Sarà poi l'index.php ad avvisare l'utente che la risorsa cercata non esiste.

Il secondo gruppo restringe l'accesso alle pagine che iniziano per "wp-login" e "wp-admin" agli indirizzi IP indicati nel seguito (ne ho messi due di fantasia). Il primo indirizzo finisce con un .* che vuol dire "la sottorete" dei primi tre ottetti.

Il terzo (fuori dalla dichiarazione per il mod_rewrite) nega l'accesso al sito a due indirizzi (una rete ed un indirizzo per l'esattezza), che ho notato generavano spam verso il mio sito. Li terrò un altro mesetto e poi li riabilito.

Buon lavoro!
http://www.duechiacchiere.it
Loggato
doGmaI
Utente Attivo
****
Posts: 280


Guida A Mod_rewrite
« Risposta #3 il: 20 Agosto 2006, 11:22:25 »

Citazione
RewriteCond %{REMOTE_ADDR} !^123\.456\.789\..*
 
Solo per precisione, c'è un punto di troppo. Dovrebbe essere
Codice:
RewriteCond %{REMOTE_ADDR} !^123\.456\.789\.*
con un solo punto prima dell'asterisco
Loggato

coolmann
Nuovo Utente
**
Posts: 29


Guida A Mod_rewrite
« Risposta #4 il: 23 Agosto 2006, 16:16:16 »

Beh, il punto "di troppo" serve per specificare esattamente il terzo numero. Se metto il punto infatti dico "considera gli IP che iniziano per 123.156.18.xxx " dove xxx è qualsiasi cosa (in effetti anche lettere eh eh). Mentre senza il doppio punto, dico "considera gli IP che iniziano per 123.156.18xxx " quindi in questo caso escluderei anche l'IP 123.156.181.12 ad esempio, mentre l'idea è quella di escludere una sottorete... Just my 5 cents.
Loggato
doGmaI
Utente Attivo
****
Posts: 280


Guida A Mod_rewrite
« Risposta #5 il: 23 Agosto 2006, 17:55:00 »

Ammetto di non averlo provato, ma il doppio punto è sbagliato

Quella è una espressione regolare e il pattern ^123\.456\.789\..* come hai inserito tu fa match con
123.456.789..aaa
123.456.789..000
123.456.789..maramaopercheseimorto
123.456.789..1a2b3c4d

Per escludere una sottorete basta un solo punto
^123\.456\.789\.*
che fa il match con
123.456.789.abc
123.456.789.000
123.456.789.abc00000000000

Se proprio vogliamo essere pignoli potremmo fare sostituire la regex con ^123\.456\.789\.[0-9]{1,3} che fa il match con
123.456.789.0
123.456.789.00
123.456.789.000
e basta

Il doppio punto non va

Ovviamente potrei anche sbagliare...
Loggato

coolmann
Nuovo Utente
**
Posts: 29


Guida A Mod_rewrite
« Risposta #6 il: 23 Agosto 2006, 18:08:54 »

Ciao Dogmai, ammetto la mia poca esperienza in fatto di espressioni regolari (ho sempre avuto una certa repulsione, forse trauma dai tempi dell'università? eheh). In effetti il punto non serve (la mia idea era di esprimere il concetto "almeno un carattere" mettendo punto(senza backslash)-asterisco alla fine della sottorete). Grazie per la precisazione :-) Correggo il mio script...
Loggato
doGmaI
Utente Attivo
****
Posts: 280


Guida A Mod_rewrite
« Risposta #7 il: 24 Agosto 2006, 20:55:37 »

Figurati...

Sono un po' rognose le espressioni regolari.
Anche io ho sempre paura di fare qualche vaccata Linguaccia
Loggato

jAmes.87
Appena Entrato
*
Posts: 1


Re: Guida A Mod_rewrite (parte 4)
« Risposta #8 il: 6 Agosto 2007, 20:08:09 »

Ciao a tutti.

Nel mio .htaccess ho scritto:
RewriteRule ^(.*)/(.*)/(.*)/ rewriterule.php?mod=$1&id=$2&action=$3 [L]

Se nella url ci metto http://www.sito.it/articoli/34/stampa/xxx, la QUERY_STRING è mod=articoli/34&id=stampa&action=xxx

Quello che vorrei è fare in modo che tutto quello che viene dopo stampa/ venga messo in un'altra variabile chiamata ad esempio 'extra', cioè il risultato che voglio è:
mod=articoli&id=34&action=stampa&extra=xxx.

Come si fa?
Loggato
coolmann
Nuovo Utente
**
Posts: 29


Re: Guida A Mod_rewrite (parte 4)
« Risposta #9 il: 6 Agosto 2007, 22:03:33 »

Mah così ad occhio (non l'ho provato) aggiungerei semplicemente un (.*) alla fine e farei un extra=$4 dopo:

RewriteRule ^(.*)/(.*)/(.*)/(.*) rewriterule.php?mod=$1&id=$2&action=$3&extra=$4 [L]

Se puo' esserti utile guarda anche qui

http://forum.cached.it/forum/t104-Guida-Mod_rewrite-con-esempi-minitutorial.html
Loggato
abbeyschool
Appena Entrato
*
Posts: 1


Re: Guida A Mod_rewrite (parte 4)
« Risposta #10 il: 20 Novembre 2008, 13:37:10 »

Ciao a tutti.
Nel mio sito non riesco a visualizzare una pagina dove ci sono due variabili.

http://www.miosito.it/index.php?p=n...mp;i=nomeutente

nomeutente lo carica da un db.

il mio .htaccess è il seguente:

RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_URI} index/(.*)/(.*).html
RewriteRule ^index/(.*)/(.*).html$ /default.php?p=$1&lingua=$2

RewriteCond %{REQUEST_URI} index/(.*)/(.*)/(.*).html
RewriteRule ^index/(.*)/(.*)/(.*).html$ /default.php?p=$1&lingua=$2&i=$3

la pagina riscritta in modo statico 'dovrebbe' essere quindi:

http://www.miosito.it/index/nomepag...nomeutente.html

La pagina la apre, ma mi visualizza solo parte di "default.php" e nulla della pagina "nomepagina" e tantomeno le informazioni di "nomeutente".

E' ovvio che sbaglio da qualche parte, ma dove.

Se potete aiutarmi.

Grazie
« Ultima modifica: 20 Novembre 2008, 17:55:52 da abbeyschool » Loggato
Pagine: [1]
 
 
Salta a:  

Oggetto Iniziato da Risposte Visto Ultimo Post
Il modulo mi fa arrabbiare! puma512 2 2574 Ultimo Post 8 Febbraio 2009, 23:09:42
da puma512
Le cose da NON fare con AdSense. lacellula 0 3172 Ultimo Post 18 Settembre 2007, 10:32:19
da lacellula
Il Wi-max Come Strumento Anti Digital Divide luke 0 1844 Ultimo Post 11 Gennaio 2007, 15:57:40
da luke
Scrivere Articoli E Guadagnare Con Adsense guardaqua 0 3413 Ultimo Post 2 Febbraio 2006, 13:18:33
da guardaqua
La Psicosi Del Brodo Di Cappone effe8 2 2523 Ultimo Post 2 Marzo 2006, 21:30:15
da step76
Powered by MySQL Powered by PHP Powered by SMF 1.1.8 | SMF © 2006-2008, Simple Machines LLC
Traduzione Italiana a cura di SMItalia

TinyPortal v0.9.8 © Bloc
XHTML 1.0 Valido! CSS Valido!


Ultima visita di Google a questa pagina Oggi alle 03:43:27