Visualizzazione dei risultati da 1 a 10 su 10

Discussione: ancora rewrite

  1. #1

    ancora rewrite

    mi spiace disturbarvi ulteriormente...
    probabilmente la domanda è stata già fatta innumerevoli volte, ma non riesco a venirne a capo e non so come muovermi.
    le mie conoscenze del suddetto modulo sono pressoché inesistenti, quindi spero che qualche paziente saggio mi illumini.
    detto questo espongo il mio problema:

    il mio sito genera del codice già utilizzando .htaccess
    codice:
    RewriteEngine On 
    RewriteBase /catalog/
    RewriteRule ^(.*)_p_(.*).html$ product_info.php?products_id=$2&%{QUERY_STRING}
    RewriteRule ^(.*)_c_(.*).html$ index.php?cPath=$2&%{QUERY_STRING}
    RewriteRule ^(.*)_m_(.*).html$ index.php?manufacturers_id=$2&%{QUERY_STRING}
    i link sono generati in php e nell'indirizzo appare sempre il nome della pagina con alla fine aggiunta la parte incriminata _p_(.*).html
    dove al posto dell'asterisco c'è l'ID della pagina.

    fin li tutto è testato e funziona a dovere.

    ora arriva il mal di pancia:

    premettendo che sviluppo una versione accessibile e più completa del pacchetto oscommerce, quello che vorrei ottenere è qualcosa del genere:
    ora è ovvio che le categorie e le sotto categorie possono essere più di 2, quindi mi servirebbe un codice "che sia utile anche per N categorie"

    la parte in PHP l'ho già realizzata, quindi sul sito mi appare già in maniera corretta, devo solo creare la contro-parte per apache.
    altra cosa ovvia, nel caso di cartelle nel suddetto sito non deve andare in conflitto
    codice:
    esempio: http://localhost/catalog/nome-catego...olo_p_123.html
    se esiste una cartella: http://localhost/catalog/nome-categoria/sclero.php
    non deve aprirmi la pagina, ma deve entrare nella sotto-cartella ed eseguire il codice sclero.php
    grazie a chi mi vorrà aiutare.

    altra premessa..... se riesco in questa missione il codice sarà pubblicato sul sito ufficiale dei oscommerce aggiornando la contrib seo_url ed ovviamente sul mio pacchetto OsWai.

  2. #2
    risolto in parte:
    ora ho aggiunto nell'indirizzo ad inizio pagina un "-" in modo da non confondere le cartelle "reali" con quelle "fittizie".
    codice:
      RewriteCond %{REQUEST_URI} ^/-
    così se non c'è il trattino la cartella viene ignorata.

    in php i link vengono generati correttamente
    sito/-cartella/pagina_p_28.html
    ho provato mettendo
    codice:
    RewriteRule ^(.*)\/(.*)_p_(.*).html$ product_info.php?products_id=$3&%{QUERY_STRING} [L]
    ma non funziona, non viene riscritta come
    sito/product_info.php?products_id=28

  3. #3
    Utente di HTML.it L'avatar di Enoa
    Registrato dal
    Jul 2005
    Messaggi
    573
    Aggiungi queste regole subito dopo RewriteEngine On:
    codice:
    RewriteCond %{REQUEST_FILENAME} -f [OR]
    RewriteCond %{REQUEST_FILENAME} -d
    RewriteRule . - [L]
    Se il file o la cartella esistono sul filesystem, le regole successive vengono ignorate

  4. #4
    grazie senz'altro utilissima aggiunta.

    una informazione:
    le condizioni RewriteCond si applicano sulla immediatamente successiva RewriteRule giusto ?
    nel senso: se metto 2 RewriteRule la prima con COndizione, il secondo RewriteRule è fuori controllo.

    esempio
    RewriteCond
    RewriteRule 1
    RewriteRule 2
    la prima è sotto il controllo della condizione, la seconda no.
    e se volessi che entrambe fossero sotto il medesimo RewriteCond

    nel php è semplice:

    RewriteCond {
    RewriteRule 1
    RewriteRule 2
    }

    ma nell'htaccess come faccio ?

    p.s. grazie per la dritta... mi hai risolto 1 grana

  5. #5
    modificato l'htaccess nel seguent emodo:
    codice:
      RewriteEngine On #è scontto che ci sia ;)
    
      # controlla che sia una categoria merceologica (deve iniziare obbligatoriamente per "-" )
      RewriteCond %{REQUEST_URI} ^-
      # controlla che la pagina richiesta non sia accidentalmente una cartella "reale"
      RewriteCond %{REQUEST_FILENAME} -f [OR]
      RewriteCond %{REQUEST_FILENAME} -d
      RewriteRule ^(.*)\/(.*)_p_(.*).html$ product_info.php?products_id=$3&%{QUERY_STRING} [L]
    nella barra degli indirizzi esce la URL corretta:
    sito/-categoria/prodotto_p_35.html
    ma invece di riscrivermi l'URL come
    sito/product_info.php?product_id=35
    mi da pagina non trovata.

    (lo sento... è una cavolata, ma come sempre l'ovvio è ovvio solo per chi lo sa)

  6. #6
    Utente di HTML.it L'avatar di Enoa
    Registrato dal
    Jul 2005
    Messaggi
    573
    L'ordine delle rule e cond è importante, soprattuto perchè nelle cond l'"AND" è implicito.
    http://httpd.apache.org/docs/current...ml#rewritecond
    6. ..............
    ............
    'ornext|OR' (or next condition)
    Use this to combine rule conditions with a local OR instead of the implicit AND.......
    .........
    da come la hai scritta tu questo è un unico blocco:
    codice:
    RewriteCond %{REQUEST_URI} ^- //AND
    RewriteCond %{REQUEST_FILENAME} -f [OR]
    // se continete - ed è un file che esiste altrimenti se è una cartella ->
    RewriteCond %{REQUEST_FILENAME} -d
    RewriteRule ^(.*)\/(.*)_p_(.*).html$ product_info.php?products_id=$3&%{QUERY_STRING} [L]
    Le regole che ti ho consigliato, se questo è il contenuto attuale dell'htaccess:
    codice:
    RewriteEngine On 
    RewriteBase /catalog/
    RewriteRule ^(.*)_p_(.*).html$ product_info.php?products_id=$2&%{QUERY_STRING}
    RewriteRule ^(.*)_c_(.*).html$ index.php?cPath=$2&%{QUERY_STRING}
    RewriteRule ^(.*)_m_(.*).html$ index.php?manufacturers_id=$2&%{QUERY_STRING}
    vanno messe subito dopo il RewriteEngine On
    codice:
    RewriteEngine On
    
    RewriteCond %{REQUEST_FILENAME} -f [OR] //se l'url richiesto è un file che esite
    RewriteCond %{REQUEST_FILENAME} -d // se l'url richiesto è una cartella che esiste
    RewriteRule . - [L] // non fare niente e salta il resto: flag [L]
    
    RewriteBase /catalog/
    RewriteRule ^(.*)_p_(.*).html$ product_info.php?products_id=$2&%{QUERY_STRING}
    RewriteRule ^(.*)_c_(.*).html$ index.php?cPath=$2&%{QUERY_STRING}
    RewriteRule ^(.*)_m_(.*).html$ index.php?manufacturers_id=$2&%{QUERY_STRING}
    EDIT
    queste:
    codice:
    RewriteRule ^(.*)_p_(.*).html$ product_info.php?products_id=$2&%{QUERY_STRING}
    RewriteRule ^(.*)_c_(.*).html$ index.php?cPath=$2&%{QUERY_STRING}
    RewriteRule ^(.*)_m_(.*).html$ index.php?manufacturers_id=$2&%{QUERY_STRING}
    è meglio scriverle come:
    codice:
    RewriteRule ^(.*)_p_(.*).html$ product_info.php?products_id=$2 [L,QSA]
    RewriteRule ^(.*)_c_(.*).html$ index.php?cPath=$2 [L,QSA]
    RewriteRule ^(.*)_m_(.*).html$ index.php?manufacturers_id=$2 [L,QSA]
    http://httpd.apache.org/docs/current...ml#rewriterule
    http://httpd.apache.org/docs/current....html#flag_qsa
    http://httpd.apache.org/docs/current...gs.html#flag_l

  7. #7
    ancora grazie.
    ho ri-modificato l'htaccess cosi'
    codice:
    DirectoryIndex index.php
    <IfModule mod_rewrite.c>
      RewriteEngine On
    
      RewriteCond %{REQUEST_FILENAME} -f [OR] # se l'url richiesto e' un file che esiste
      RewriteCond %{REQUEST_FILENAME} -d # se l'url richiesto e' una cartella che esiste
      RewriteRule . - [L] # non fare niente e salta il resto: flag [L]
    
      RewriteBase /catalog/
      RewriteRule ^(.*)_m_(.*).html$ index.php?manufacturers_id=$2&%{QUERY_STRING} [L]
    # ....
    # una 15 di Rule che cambiano in base alla pagina e non possono contenere '/' nel testo
    # ....
      RewriteRule ^(.*)_po_([0-9]+).html$ pollbooth.php?pollid=$2&%{QUERY_STRING} [L]
    
    # rule che possono contenere '/' nel testo dell'URL
      RewriteRule ^(.*)_c_(.*).html$ index.php?cPath=$2&%{QUERY_STRING} [L]
    
     # RewriteRule ^(.*)/(.*)_p_(.*).html$ product_info.php?products_id=$3&%{QUERY_STRING} [L]
      RewriteRule ^(.+)_p_(.*).html$ product_info.php?products_id=$2&%{QUERY_STRING} [L]
     # RewriteRule ^(.*)_p_(.*).html$ product_info.php?products_id=$2&%{QUERY_STRING} [L]
    
    </IfModule>
    risultato ... Error 500

    visto che si può controllare se la richiesta è un file o una directory ho tolto il "-" dalle categorie
    quindi i link in php adesso sono scritti:
    sito/catalog/categoria/prodotto_p_23.html
    ora i problemi sono 2:
    i link che contengono _c_xx.html (dove xx è un valore alfanumerico)
    e i link che contengono _p_xx.html (dove xx è un valore alfanumerico)
    possono contenere infinite sotto cartelle. /cate1/sottocat1/sottocat2/ecc.

    tutti gli altri non hanno '/' nel testo del link.
    altri suggerimenti ?

    se qualcuno è in grado di risolvere, possiamo pattuire una retribuzione (ovviamente con fattura).. meglio ancora in un aiuto "spontaneo"

  8. #8
    Utente di HTML.it L'avatar di Enoa
    Registrato dal
    Jul 2005
    Messaggi
    573
    Controlla il log degli errori, magari c'è un errore in una delle rule

  9. #9
    non ho risolto, ma devo ringraziarti moltissimo per le dritte.
    infatti ho velocizzato il sito di un 5% (statistico)
    ho messo un controllo per evitare il rewrite delle cartelle immagini, dowload, ecc. che non necessitavano del rewrite
    ho messo QSA come mi hai consigliato.

    che dire GRAZIE!!!!!

    anche se non funziona, era la parte in PHP che dava problemi... avevo modificato una buona parte del codice, ma non tutta.
    appena ho un po' di tempo ci rimetto le mani e ci riprovo.

  10. #10
    Utente di HTML.it L'avatar di Enoa
    Registrato dal
    Jul 2005
    Messaggi
    573
    Non so se sia bastato così poco per aver velocizzare il sito, ma mi fa piacere
    Originariamente inviato da maury2ma
    ............
    ho messo un controllo per evitare il rewrite delle cartelle immagini, dowload, ecc. che non necessitavano del rewrite
    in che senso? se nell'html usi link assoluti, il problema te lo dovrebbero risolvere le regole che ti ho postato.
    Se hai accesso alla conf del virtualhost, al termine del debug metti le regole direttamente lì, imposta l'AllowOverride su Off e restarta apache. vedrai migliorarà ancora

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.