2012-09-03 112 views
5

我有一组类似的网址...的.htaccess URL重写删除查询字符串键

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/ 

并希望将其转换为..

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

基本上我想隐藏键来自查询字符串。

如何做到这一点?任何帮助?

编辑

我有每一页不同的密钥和则每页有25项。

+0

这是有些不清楚。您的控制器重定向的问题是否与第一组网址相似,并希望浏览器仅显示第二个网址列表?如果是这样,是否有任何理由不想用Apache和mod_rewrite来做到这一点? – FilmJ

+0

是的,你是对的。我并没有说我不想用Apache和mod_rewrite来做到这一点。 –

+0

从你的示例URL这几乎是不可能的,你怎么知道什么价值来自哪个关键?如果你删除了钥匙,它们就消失了。你将需要一种模式来再次解决每个值 –

回答

4

您可以使用Zend_Controller_Router_Route和/或Zend_Controller_Router_Route_Regex并定义路线

$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

除非我误解了,否则这并不能解决他的问题,即他希望首先实际重写URL ......但是,这将提供解决方案来解释重写的URL。 – FilmJ

2

前端控制器是一种设计模式,它通过单点映射uri,而Zend使用前端控制器模式。这个映射可以在bootstrap.php中修改。我搜索了一下,发现this questio这很相似。

2

我会保留默认.htaccess,将所有请求(除img,css,js等前端资源)路由到index.php。然后在引导程序中添加routes以处理您的重定向。

对于想要更改为新网址的现有网址,我会创建一个RedirectController,其动作重定向 - 实际上使用HTTP 301代码重定向,而不仅仅是执行相同的操作 - 到您想要的网址。

有一个反对在应用程序级别通过路由实现重定向的有效参数vs处理它.htaccess:由于需要整个引导程序/调度周期以使重定向发生,所以性能会较差。这是一个公平的论点,但我发现将所有的路由信息​​放在一个地方,而不是在.htaccess和我的应用程序级别路线上分开。

2

试试这个

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

的规则顺序是非常重要的。不要换。规则1必须始终在规则2之前。规则4必须始终是最后一个。顺序是从最特别的到最通用的规则。规则3可以在任何位置,但在规则4之前。

0
  1. 尝试统一您的网址。那么与它合作会更容易。 这是一个实际的例子。

的.htaccess文件

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