Router::redirect() を使用する方法が見つからなかったので、元のルートを維持しました。
Router::connect("/:category/:product-name/*",
array(
'controller' => 'products', 'action' => 'view'
),
array(
'routeClass' => 'CategoryRouteClass',
'pass' => array('category', 'product-name')
)
);
新しいURLに一致する新しいルートを追加し、同じメソッドと同じコントローラーを指しますが、新しいルート要素を追加してメソッド引数として渡します。
Router::connect("/:store-section/:category/:product-name/*",
array(
'controller' => 'products', 'action' => 'view'
),
array(
'routeClass' => 'CategoryRouteClass',
'pass' => array('category', 'product-name', 'store-section')
)
);
...次に、製品コントローラーのビュー メソッドで、store-section パラメーターが設定されているかどうかを確認します。設定されていない場合は、次のように、現在の URL にデフォルトの store-section を追加するリダイレクトを発行します。
Class ProductsController extends AppController {
public function view($category= null, $product-name = null,
$store-section = null) {
if (empty($store-section)) {
$this->redirect(array(
'controller' => 'products', 'action' => 'view',
'category' => $category,
'product-name' => $product-name,
'store-section' => 'default-section'), '301');
}
//.................
}
}
これにより、古い製品の URL から新しい製品への 301 が正常に発行され、SEO に役立ち、古いインバウンドリンクを Cakephp で機能させ続けることができます。