.htaccess Url重写删除查询字符串键

时间:2012-09-03 06:33:20

标签: php .htaccess zend-framework url-rewriting

我有一组像...这样的网址。

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个键。

5 个答案:

答案 0 :(得分: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);

答案 1 :(得分:2)

前端控制器是一种设计模式,它通过单点映射uri,Zend使用前端控制器模式。这个maping可以在bootstrap.php上更改。我用Google搜索并发现this questio n非常相似。

答案 2 :(得分:2)

我会维护默认的.htaccess,它将所有请求(除了img,css,js等前端资源除外)路由到index.php。然后在bootstrap中添加routes以处理重定向。

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

有一个有效的论据反对通过路由在应用级别实现重定向而不是处理它.htaccess:由于需要整个引导/调度周期才能使重定向发生,因此它的性能会降低。这是一个公平的论点,但我发现将所有路由信息放在一个地方更清楚,而不是分成.htaccess和我的应用级路由。

答案 3 :(得分: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之前。

答案 4 :(得分:0)

  1. 尝试统一您的网址。然后它将更容易使用。 这是一个实际的例子。
  2. .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);
    ?>
    
相关问题