- Home
- Categorie
- La Community Connect.gt
- Tutto sulla Community
- Aiuto per regola mod rewrite semplice -> sto uscendo pazzo
-
Aiuto per regola mod rewrite semplice -> sto uscendo pazzo
Ciao,
sono settimane che convivo con un problema che non riesco a risolvere.. ho scritto una serie di regole che fanno in modo di trasformare alcuni indirizzi in questo modo:
www.dominio.it/it/ -> www.dominio.it/index.php?l=it
www.dominio.it/it/pagina.php -> www.dominio.it/pagina.php?l=itFin qui tutto bene.. ora però vorrei aggiungere la regola finale che fa qualcosa del genere: se l'url non contiene nè un riferimento alla directory it/ nè alla directory en/ => mostra la pagina 404.php.
Ma qua tutti i miei tentativi sono miseramente falliti..DirectoryIndex index.html index.htm index.php RewriteEngine On RewriteRule ^(it|en)/file/site/image/(menu|titoli)/(.+)$ file/site/image/$1/$2/$3 [L,NC] RewriteRule ^(it|en)/(.+)$ $2?l=$1 [L,QSA,NC] RewriteRule ^(it|en)/$ index.php?l=$1 [L,NC] RewriteRule ^[^it/]$ RewriteRule ^[^en/]$ 404.php [L,NC] ErrorDocument 404 404.php
Come si fa? Abbiate pietà di me..
Ciao e grazie.
-
prova a mettere sopra, come prima condizione la RewriteCond che se REQUEST_URI ^/en
allora reindirizzi ad un 404 e fai bloccare l'esecuzioneRewriteCond %{REQUEST_URI} !^\/en RewriteRule .* 404.php
Ciao
-
Ora ho queste regole.. però non abbiamo fatto passi avanti: ogni url, di qualsiasi tipo, rimanda alla pagina 404.php..
DirectoryIndex index.html index.htm index.php ErrorDocument 404 /headroom.it/404.php RewriteEngine On RewriteCond %{REQUEST_URI} !^\/en RewriteRule .* 404.php RewriteRule ^(it|en)/file/site/image/(menu|titoli)/(.+)$ file/site/image/$1/$2/$3 [L,NC] RewriteRule ^(it|en)/(.+)$ $2?l=$1 [L,QSA,NC] RewriteRule ^(it|en)/$ index.php?l=$1 [L,NC]
-
Esplico ancora meglio il mio problema..
Il sito per ora è in locale sul mio pc dato che lo sto sviluppando.
L'url locale è il seguente: http://localhost/headroom.it/
Quindi ho pensato di modificare le mie regole in questo modo:
DirectoryIndex index.html index.htm index.php ErrorDocument 404 /headroom.it/404.php RewriteEngine On RewriteBase /headroom.it RewriteRule ^.*room\.it/chi_siamo.*$ 404.php [L,NC] RewriteRule ^(it|en)/file/site/image/(menu|titoli)/(.+)$ file/site/image/$1/$2/$3 [L,NC] RewriteRule ^(it|en)/(.+)$ $2?l=$1 [L,QSA,NC] RewriteRule ^(it|en)/$ index.php?l=$1 [L,NC]
La prima regola:
RewriteRule ^.room.it/chi_siamo.$ 404.php [L,NC]
Nella mia testa dovrebbe trasformare
http://localhost/headroom.it/chi_siamo.php
In:
http://localhost/headroom.it/404.phpIn realtà ciò non succede e mi viene mostrata la pagina chi_siamo.php
Quello che ho immaginato io è di avere un sito con questa struttura:
/index.php
/chi_siamo.php
/contatti.phpChe con le regole di rewrite doveva essere mascherato in questo modo:
/it/index.php -> /index.php?l=it
/it/chi_siamo.php -> /chi_siamo.php?l=itIn modo da realizzare con le stesse pagine php tutta una finta struttura multilingue.
Quello che mi ero prefisso l'ho quasi raggiunto, gli url di questo tipo:
/it/file.estensione
vengono tutti trasformati in:
/file.estensione?l=it & QUERY_STRINGL'unica fregatura è che se chiedo al server di darmi:
/pagina.php
Questo me la ritorna.. ma la pagina ha ovviamente dei problemi perchè manca la LINGUA (?l=it) e manca l'alberatura giusta delle (finte) directory, quindi non vengono caricate le immagini e via dicendo.Lo so che potrei risolvere il problema con un controllo nel codice php ma volevo capire perchè non deve funzionare nel .htaccess dove il tutto sarebbe molto più elegante e comodo.
Uff..
Ciao!
-
dai sempre le condizioni per applicare una regola.
la logica è: "se c'è questa condizione fai questo".
Quindi ad esempio:DirectoryIndex index.html index.htm index.php DirectoryIndex index.html index.htm index.php ErrorDocument 404 /headroom.it/404.php RewriteEngine On #prima condizione la richiesta è diversa sia da "it" che da "en" allora 404 RewriteCond %{REQUEST_URI} !^\/en RewriteCond %{REQUEST_URI} !^\/it RewriteRule .* 404.php RewriteCond %{REQUEST_URI} ^\/(it|en)\/file\/site\/image\/(menu|titoli)\/(.+)$ RewriteRule ^(it|en)\/file\/site\/image\/(menu|titoli)\/(.+)$ file/site/image/$1/$2/$3 [L,NC] # e cosi via... ```Ciao
-
Ciao,
ho riscritto come mi hai detto, ma qualsiasi indirizzo digitato rimanda a 404.phpTi riporto il mio .htaccess
DirectoryIndex index.html index.htm index.php ErrorDocument 404 /headroom.it/404.php RewriteEngine On RewriteBase /headroom.it RewriteCond %{REQUEST_URI} !^\/en RewriteCond %{REQUEST_URI} !^\/it RewriteRule .* 404.php RewriteCond %{REQUEST_URI} ^\/(it|en)\/file\/site\/image\/(menu|titoli)\/(.+)$ RewriteRule ^(it|en)\/file\/site\/image\/(menu|titoli)\/(.+)$ file/site/image/$1/$2/$3 [L,NC] RewriteCond %{REQUEST_URI} ^\/(it|en)/(.+)$ RewriteRule ^(it|en)/(.+)$ $2?l=$1 [L,QSA,NC] RewriteCond %{REQUEST_URI} ^\/(it|en)/$ RewriteRule ^(it|en)/$ index.php?l=$1 [L,NC]
L'impressione mia è o che le RewriteCond vengano bellamente ignorate o che le prime due siano sempre vere.
Ti allego anche il log che ho fatto generare al server:
127.0.0.1 - - [26/Jun/2007:13:43:08 +0200] [localhost/sid#26bf10][rid#c4d438/initial] (2) [per-dir C:/my_folder/Dati/Lavoro/_siti/headroom.it/] rewrite it/chi_siamo.php -> 404.php 127.0.0.1 - - [26/Jun/2007:13:43:08 +0200] [localhost/sid#26bf10][rid#c4d438/initial] (2) [per-dir C:/my_folder/Dati/Lavoro/_siti/headroom.it/] trying to replace prefix C:/my_folder/Dati/Lavoro/_siti/headroom.it/ with /headroom.it 127.0.0.1 - - [26/Jun/2007:13:43:08 +0200] [localhost/sid#26bf10][rid#c4d438/initial] (1) [per-dir C:/my_folder/Dati/Lavoro/_siti/headroom.it/] internal redirect with /headroom.it/404.php [INTERNAL REDIRECT] 127.0.0.1 - - [26/Jun/2007:13:43:08 +0200] [localhost/sid#26bf10][rid#c51150/initial/redir#1] (2) [per-dir C:/my_folder/Dati/Lavoro/_siti/headroom.it/] rewrite 404.php -> 404.php 127.0.0.1 - - [26/Jun/2007:13:43:08 +0200] [localhost/sid#26bf10][rid#c51150/initial/redir#1] (1) [per-dir C:/my_folder/Dati/Lavoro/_siti/headroom.it/] initial URL equal rewritten URL: C:/my_folder/Dati/Lavoro/_siti/headroom.it/404.php [IGNORING REWRITE]
Ciao!
-
Anzi.. a dirti la verità non funziona più nulla.. penso di aver spagliato qualcosa nello scrivere le condizioni dato che anche con questo .htaccess minimale non si visualizza più alcuna pagina
DirectoryIndex index.html index.htm index.php ErrorDocument 404 /headroom.it/404.php RewriteEngine On RewriteBase /headroom.it RewriteCond %{REQUEST_URI} ^(it|en)\/file\/site\/image\/(menu|titoli)\/(.+)$ RewriteRule ^(it|en)\/file\/site\/image\/(menu|titoli)\/(.+)$ file/site/image/$1/$2/$3 [L,NC] RewriteCond %{REQUEST_URI} ^(it|en)\/(.+)$ RewriteRule ^(it|en)/(.+)$ $2?l=$1 [L,QSA,NC] RewriteCond %{REQUEST_URI} ^(it|en)\/$ RewriteRule ^(it|en)/$ index.php?l=$1 [L,NC]
Sia:
RewriteCond %{REQUEST_URI} ^(it|en)/(.+)$
che:
RewriteCond %{REQUEST_URI} ^/(it|en)/(.+)$
non hanno effetto, ho provato entrambe le versioni..
-
mi butto ma potrei fare errori visto che non posso testarlo
(verifica nella rewriteCond se va bene con ^/testo opure con ^testo)DirectoryIndex index.html index.htm index.php ErrorDocument 404 /headroom.it/404.php RewriteEngine On RewriteBase /headroom.it/ RewriteCond %{REQUEST_URI} !^en.* RewriteCond %{REQUEST_URI} !^it.* RewriteRule .* 404.php RewriteCond %{REQUEST_URI} ^\/(it|en)\/file\/site\/image\/(menu|titoli)\/(.+)$ RewriteRule ^(it|en)\/file\/site\/image\/(menu|titoli)\/(.+)$ file/site/image/$1/$2/$3 [L,NC] RewriteCond %{REQUEST_URI} ^(it|en)\/(.+)$ RewriteRule ^(it|en)\/(.+)$ $2?l=$1 [QSA,NC,L] RewriteCond %{REQUEST_URI} ^\/(it|en)\/$ RewriteRule ^(it|en)\/$ index.php?l=$1 [NC,L] ```Occhio agli escape. ;)
-
No.. purtroppo non ci siamo...
Oltretutto con la direttiva RewriteRule non serve l'escape sul carattere "/".
Infatti ho fatto una prova con con un .haccess di test:
RewriteEngine On RewriteRule ^(it|en)/(.+)$ $2?l=$1 [QSA,NC,L]
La trasformazione avviene correttamente:
localhost/headroom.it/it/index.php -> localhost/headroom.it/index.php?l=itSe invece io uso questo .htaccess:
RewriteEngine On RewriteCond %{REQUEST_URI} ^(it|en)/(.+)$ RewriteRule ^(it|en)/(.+)$ $2?l=$1 [QSA,NC,L]
provando anche tutte le combinazioni per RewriteCond:
RewriteCond %{REQUEST_URI} ^(it|en)/(.+)$
RewriteCond %{REQUEST_URI} ^(it|en)/(.+)$
RewriteCond %{REQUEST_URI} ^/(it|en)/(.+)$
RewriteCond %{REQUEST_URI} ^/(it|en)/(.+)$Ottengo un errore 404 -> la trasformazione dell'url non avviene.
Direi che c'è un qualche errore su RewriteCond che nn avendo mai esito positivo blocca la RewriteRule..
-
Ho fatto notevoli passi avanti, ho almeno scoperto la sintassi che funziona sul mio server:
RewriteCond %{REQUEST_URI} /(it|en)/file/site/image/(menu|titoli)/(.+) RewriteRule ^(it|en)/file/site/image/(menu|titoli)/(.+)$ file/site/image/$1/$2/$3 [L,NC] RewriteCond %{REQUEST_URI} /(it|en)/(.+) RewriteRule ^(it|en)/(.+)$ $2?l=$1 [QSA,NC,L] RewriteCond %{REQUEST_URI} /(it|en)/$ RewriteRule ^(it|en)/$ index.php?l=$1 [NC,L]
Ho anche scoperto che se inserisco una regola di questo tipo:
RewriteCond %{REQUEST_URI} /it/
RewriteRule ^.*$ 404.php [NC,L]Riesco a vedere url di questo tipo:
http://localhost/headroom.it/en/
Mentre blocco url di questo tipo:
http://localhost/headroom.it/it/Non è male come passo avanti, no?
La fregatura è che non funziona la negazione.. se infatti nego questa condizione dovrei ottenere un risultato opposto.. invece sia con it/ che con en/ nell'url ottengo un 404.php.
Bho..
-
Bene bene, mi piacciono i miglioramenti.
Confermo che l'escape sullo "/" può non essere fatto(la mia è deformazione professionale.....) ma si devono escapare gli altri caratteri tipo . ? etc.
Quindi buono cosi.A quasto punto mi pare di aver capito che ti manca il 404...
RewriteCond %{REQUEST_URI} /it/
RewriteRule ^.*$ 404.php [NC,L]ti blocca l'it giustamente, se scrivi en ti blocca l'en se li metti tutti e due ti blocca tutti e 2.
Sei sicuro che la negazione non funzioni?
vista la sintassi che ti funziona direi cosi:RewriteCond %{REQUEST_URI} !/it/
RewriteCond %{REQUEST_URI} !/en/
RewriteRule ^.*$ 404.php [NC,L]in caso non funzioni io personalmente testerei:
RewriteCond %{REQUEST_URI} !^/en/
RewriteCond %{REQUEST_URI} !^/it/oppure
RewriteCond %{REQUEST_URI} !^/en/.*
RewriteCond %{REQUEST_URI} !^/it/.*e magari anche
RewriteRule .* 404.php [NC,L] al posto di RewriteRule ^.*$ 404.php [NC,L]
Speriamo bene