2012-09-03 31 views
5

que tienen un conjunto de URLs como ....htaccess de reescritura de URL Retire cadena de consulta Claves

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/ 

y desea convertir como ..

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

Básicamente quiero ocultar teclas de la cadena de consulta.

¿Cómo hacer esto? ¿Alguna ayuda?

Editar

que tienen claves diferentes para cada página y hay alrededor de 25 teclas por página.

+0

Esto es un tanto confusa. ¿El problema es que tiene redirecciones provenientes de sus controladores que se parecen al primer conjunto de URL y quiere que el navegador solo muestre la segunda lista de URL?Si es así, ¿hay alguna razón por la que no quieras hacer esto con Apache y mod_rewrite? – FilmJ

+0

Sí, lo está haciendo bien. Y no dije que no quisiera hacer esto con Apache y mod_rewrite. –

+0

Desde su URL de ejemplo esto es casi imposible, ¿cómo sabría qué valor proviene de qué clave? si quitas las llaves, se han ido. necesitaría un patrón para resolver cada valor nuevamente –

Respuesta

4

Puede utilizar Zend_Controller_Router_Route y/o Zend_Controller_Router_Route_Regex y definir las rutas

$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 menos que esté equivocado, esto no resolvería su problema, que es que realmente quiere reescribir primero las URL ... sin embargo, esto proporcionaría la solución para interpretar las URL reescritas. – FilmJ

2

El controlador frontal es un patrón de diseño que mapea uri a través de un solo punto y Zend usa el patrón del controlador frontal. Este maping puede cambiarse en bootstrap.php. Busqué en Google y encontré this questio n, que es bastante similar.

2

Mantendría el valor por defecto .htaccess que enruta todas las solicitudes (excepto los recursos de front-end como img, css, js, etc.) a index.php. A continuación, agregue routes en bootstrap para manejar su redirección.

Para las direcciones URL existentes que desea cambiar a las nuevas direcciones URL, crearía un RedirectController con acciones que redireccionan, realmente redirigen, con un código HTTP 301, no solo realizan la misma acción, a las direcciones URL deseadas.

Existe un argumento válido contra la implementación de redireccionamientos a nivel de la aplicación a través de rutas vs manipulación .htaccess: será menos eficaz ya que se requiere un ciclo completo de arranque/despacho para hacer que se produzca la redirección. Este es un argumento justo, pero me parece más claro tener toda mi información de enrutamiento en un solo lugar, no dividir entre .htaccess y mis rutas a nivel de aplicación.

2

probar este

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

Las reglas de orden es muy importante. No cambies. La regla 1 debe estar siempre antes de la regla 2. La regla 4 debe ser siempre la última. El orden es de la regla más específica a la más genérica. La regla 3 podría estar en cualquier posición, pero antes de la regla 4.

0
  1. Intente uniformar su url. Entonces será más fácil trabajar con él. Aquí hay un ejemplo práctico.

.htaccess archivo:

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); 
?> 
Cuestiones relacionadas