• User

    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=it

    Fin 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.


  • User Attivo

    prova a mettere sopra, come prima condizione la RewriteCond che se REQUEST_URI ^/en
    allora reindirizzi ad un 404 e fai bloccare l'esecuzione

    
    RewriteCond %{REQUEST_URI} !^\/en 
    RewriteRule .* 404.php 
    
    

    Ciao


  • User

    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]
    
    

  • User

    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.php

    In 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.php

    Che 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=it

    In 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_STRING

    L'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!


  • User Attivo

    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

  • User

    Ciao,
    ho riscritto come mi hai detto, ma qualsiasi indirizzo digitato rimanda a 404.php

    Ti 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!


  • User

    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..


  • User Attivo

    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.
    ;)

  • User

    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=it

    Se 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..


  • User

    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..


  • User Attivo

    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 😉