5

我有一组网址,例如...

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

4

5 回答 5

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);
于 2012-09-10T16:41:40.420 回答
2

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

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

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

于 2012-09-08T06:25:14.347 回答
2

前端控制器是一种通过单点映射 uri 的设计模式,Zend 使用的是前端控制器模式。此映射可以在 bootstrap.php 中更改。我用谷歌搜索,发现这个问题非常相似。

于 2012-09-03T07:04:33.507 回答
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 之前。

于 2012-09-12T17:36:35.173 回答
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]

索引.php

<?php
    print_r($_GET);
?>
于 2012-09-14T19:14:40.457 回答