2012-09-03 11 views
5

Ho una serie di URL come ....htaccess URL Rewrite Rimuovere stringa di query Chiavi

www.example.com/page/1/name/abc 
www.example.com/city/la/name/abc 
www.example.com/page/1/name/abc/city/la 
www.example.com/page/1/ 

e si desidera convertire loro come ..

www.example.com/1/abc 
www.example.com/la/abc 
www.example.com/1/abc/la 
www.example.com/1/ 

Fondamentalmente voglio nascondere le chiavi dalla stringa di query.

Come fare questo? Qualsiasi aiuto?

Modifica

devo chiavi diverse per ogni pagina e ci sono circa 25 chiavi per pagina.

+0

Questo è alquanto incerta. Il problema riguarda il reindirizzamento proveniente dai tuoi controller che assomiglia al primo set di URL e desideri che il browser visualizzi solo il secondo elenco di URL?Se è così, c'è qualche ragione per cui non vorresti farlo con Apache e mod_rewrite? – FilmJ

+0

Sì, lo stai facendo bene. E non ho detto che non voglio farlo con Apache e mod_rewrite. –

+0

Dal tuo URL di esempio è quasi impossibile, come faresti a sapere quale valore deriva da quale chiave? se rimuovi le chiavi, sono sparite. avresti bisogno di un modello per risolvere ogni valore ancora –

risposta

4

È possibile utilizzare Zend_Controller_Router_Route e/o Zend_Controller_Router_Route_Regex e definire i percorsi

$route = new Zend_Controller_Router_Route(
    ':key/:city_name', 
    array(
     'controller' => 'somecontroller', 
     'action'  => 'pageAction' 
    ), 
    array('key' => '^\d+$') 
); 
$router->addRoute('page', $route); // www.example.com/1/abc 

$route = new Zend_Controller_Router_Route(
    ':key/:city_name', 
    array(
     'controller' => 'somecontroller', 
     'action'  => 'cityAction' 
    ), 
    array('key' => '^\d+\w+$') // www.example.com/1a/abc 
); 
$router->addRoute('city', $route); 
+2

A meno che non mi sbagli, questo non risolverà il suo problema che è che in realtà vuole riscrivere gli URL in primo luogo ... questo però fornirebbe la soluzione per interpretare gli URL riscritti. – FilmJ

2

Il controller anteriore è un modello di progettazione che esegue la mappatura di uri attraverso il punto singolo e Zend utilizza il modello del controller anteriore. Questa mappatura può essere modificata su bootstrap.php. Ho cercato su Google e trovato this questio n che è abbastanza simile.

2

Manterrei il valore predefinito .htaccess che instrada tutte le richieste (tranne le risorse front-end come img, css, js, ecc.) A index.php. Quindi aggiungere routes all'avvio per gestire il reindirizzamento.

Per gli URL esistenti che si desidera modificare in nuovi URL, creerei uno RedirectController con azioni che reindirizzano, in realtà un reindirizzamento, con un codice HTTP 301, non solo eseguendo la stessa azione, agli URL desiderati.

V'è un argomento valido contro l'attuazione di redirect verso il basso in app-livello attraverso percorsi vs gestire fino .htaccess: sarà meno performante in quanto un intero ciclo di bootstrap/spedizione è necessario per effettuare il redirect accadere. Questo è un argomento equo, ma trovo più chiaro avere tutte le mie informazioni di routing in un unico posto, non diviso tra le due linee .htaccess e le mie route a livello di app.

2

Prova questa

<IfModule mod_rewrite.c> 
    RewriteEngine on 

    #1 www.example.com/1/abc to www.example.com/page/1/name/abc (/number/string) 
    RewriteRule ^([0-9]+)/([^/]+)$ /page/$1/name/$2 [L,QSA] 

    #2 www.example.com/la/abc to www.example.com/city/la/name/abc (/string/string) 
    RewriteRule ^([^/]+)/([^/]+)$ /city/$1/name/$2 [L,QSA] 

    #3 www.example.com/1/abc/la to www.example.com/page/1/name/abc/city/la (/number/string/string) 
    RewriteRule ^([0-9]+)/([^/]+)/([^/]+)$ /page/$1/name/$2/city/$3 [L,QSA] 

    #4 www.example.com/1/ to www.example.com/page/1/ (/number/) 
    RewriteRule ^([0-9]+)/$ /page/$1/ [L,QSA] 
</IfModule> 

ordinare le regole è molto importante. Non cambiare. La regola 1 deve essere sempre prima della regola 2. La regola 4 deve essere sempre l'ultima. L'ordine è dalla regola più specifica alla più generica. La regola 3 potrebbe essere in qualsiasi posizione, ma prima della regola 4.

0
  1. Cerca di uniformare l'URL. Allora sarà più facile lavorare con. Ecco un esempio pratico.

.htaccess di file:

RewriteEngine on 

# Remove trailing '/' from URL 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} ^(.+[^/])/$ 
RewriteRule ^(.*)/$ /$1 [R=301,L] 

# Convert url to ?q=/US/en/0001 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} ^(.*)$ 
RewriteRule ^(.*)$ index.php?q=%1 [NS,L] 

# Input: /US/en/0001 
# Output print_r($_GET); 
# Array 
# (
# [country] => US 
# [locale] => en 
# [pid] => 0001 
#) 
RewriteCond %{QUERY_STRING} ^q=/([A-Z]{2})/([a-z]{2})/([0-9a-zA-Z]{4})$ 
RewriteRule ^(.*)$ ?country=%1&locale=%2&pid=%3 [NS,L] 

# Input: /US/en 
# Output print_r($_GET); 
# Array 
# (
# [country] => US 
# [locale] => en 
#) 
RewriteCond %{QUERY_STRING} ^q=/([A-Z]{2})/([a-z]{2})$ 
RewriteRule ^(.*)$ ?country=%1&locale=%2 [NS,L] 

# Input: /US 
# Output print_r($_GET); 
# Array 
# (
# [country] => US 
#) 
RewriteCond %{QUERY_STRING} ^q=/([A-Z]{2})$ 
RewriteRule ^(.*)$ ?country=%1 [NS,L] 

index.php

<?php 
    print_r($_GET); 
?>