5

私は次のような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個のキーがあります。

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

フロントコントローラーは、uriを1点でマッピングするデザインパターンであり、Zendはフロントコントローラーパターンを使用しています。このマッピングは、bootstrap.phpで変更できます。私はグーグルで検索し、かなり似ているこの質問を見つけました。

于 2012-09-03T07:04:33.507 に答える
2

.htaccessすべてのリクエスト(img、css、jsなどのフロントエンドリソースを除く)をにルーティングするデフォルトを維持しますindex.php次に、ブートストラップでルートを追加して、リダイレクトを処理します。

新しいURLに変更する既存のURLについてはRedirectController、同じアクションを実行するだけでなく、HTTP301コードを使用してリダイレクトするアクションを使用して作成します。

ルートを介してアプリレベルでリダイレクトを実装することと、それを処理することには反対の正当な議論があります。リダイレクトを実行する.htaccessには、ブートストラップ/ディスパッチサイクル全体が必要になるため、パフォーマンスが低下します。これは公正な議論ですが、すべてのルーティング情報を1つの場所に配置.htaccessし、アプリレベルのルートとアプリレベルのルートの両方に分割しない方が明確です。

于 2012-09-08T06:25:14.347 に答える
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. URLを統一してみてください。そうすれば、作業が簡単になります。これが実際の例です。

.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);
?>
于 2012-09-14T19:14:40.457 に答える