2012-09-03 157 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); 
?>