【问题标题】:CakePHP route redirect with parameters带参数的 CakePHP 路由重定向
【发布时间】:2020-04-22 14:51:54
【问题描述】:

我需要保持 SEO 链接处于活动状态,因此我正在尝试将 google 流量 301 重定向到新的 CakePHP 路由。

我去:

http://localhost/jakne/someCategory/item-slug

我希望它 301 重定向到:

http://localhost/product/item-slug

所以我尝试了route::redirect,但我无法让它工作。这方面的文档也不存在:(

$routes->redirect(
    '/jakne/:subcategory/:item',
    ['controller' => 'Catalog', 'action' => 'product'],
    ['status' => 301, 'pass' => ['item']]
);

我的Catalog::product 看起来像:

public function product($productId) {
}

我总是收到没有参数传递给操作的错误。 我错过了什么? :(

【问题讨论】:

  • 最终放弃了这个并使用了 nginx 重定向,因为它无论如何都位于 CakePHP 应用程序的前面

标签: redirect cakephp routing


【解决方案1】:

在重定向路由中保留参数的选项不是pass(用于常规路由并定义要作为函数参数传递的参数),而是persist,即您的路由需要类似于:

$routes->redirect(
    '/jakne/:subcategory/:item',
    ['controller' => 'Catalog', 'action' => 'product'],
    ['status' => 301, 'persist' => ['item']]
);

这应该可以正常工作,假设您连接了一个正确的目标路由,该路由有一个名为 item 的参数,类似于。

$routes->connect(
    '/product/:item',
    ['controller' => 'Catalog', 'action' => 'product'],
    ['pass' => ['item']]
);

通常您可能希望考虑在服务器级别执行此类重定向(例如通过 Apache 上的 mod_rewrite),这在性能方面要好得多。

ps。浏览器会缓存 301 重定向,因此在更改此类重定向时,请确保事后清除缓存。

另见

【讨论】:

  • 之前尝试过,但它不起作用。它重定向到 /product?item=value 这不是我想要的 :( 尝试使用 htaccess 规则,即使这样也不起作用。由于某种原因,它重定向到 domain.com/var/www/html/webroot/products/:item
  • @DavidLednik 如果它作为查询字符串附加,那么您要么没有匹配的目标路由,如我的示例所示,要么连接的另一条路由正在捕获它。如果您无法弄清楚,您可能需要使用完整的路线配置来更新您的问题。顺便说一句,每当您遇到路由问题时,请使用 the routes shell:bin/cake routes 检查哪些路由按顺序连接。
【解决方案2】:

试试这个对我有用的方法: 示例请求如:localhost:08080/get-username?id=%3Cid%3E

路线:

$routes->connect('/get-username', ['controller' => 'Users', 'action' => 'getUserName']);

控制器:

    class UsersController extends AppController {
       public function initialize() {
          parent::initialize();
           $this->loadComponent('RequestHandler');
       }

       public function beforeFilter(Event $event) {
          parent::beforeFilter($event);
          $this->set('_serialize', false);
          $this->Auth->allow([
            'getUserName'
          ]);
       }

       public function getUserName() {
        $id = $this->request->getQuery('id');

       }
   }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-09
    • 2013-09-14
    • 1970-01-01
    • 2018-04-22
    • 2016-11-23
    • 2015-11-20
    • 1970-01-01
    相关资源
    最近更新 更多