【问题标题】:CakePHP 3.x use htaccess to rewrite directories as pagination query paramsCakePHP 3.x 使用 htaccess 将目录重写为分页查询参数
【发布时间】:2019-05-18 19:33:41
【问题描述】:

我正在将 CakePHP 1.x 项目升级到 CakePHP 3.x

1.x 项目的 URL 发布在我们无法更改的地方,例如书籍,因此我需要重写之前的 URL 以匹配 CakePHP 3.x 中的分页 URL

这是 1.x 网址的示例

http://example.org/ledgers/index/1/2
http://example.org/ledgers/index/<page_int>/<tribe_id_int>

这就是 3.x URL 的样子

http://example.org/ledgers/index?page=1&tribe=2

我已经尝试过这个 htaccess 规则集

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
    RewriteRule ^ledgers/index/(\d)+/(\d)+$ /ledgers/index?page=$1&tribe=$2 [NC]
</IfModule>

以及来自

的输出
die(print_r($this->request->getQueryParams(), true));

Array()

我在另一个 StackOverflow 帖子中看到尝试使用

https://www.generateit.net/mod-rewrite/index.php

这给了我

RewriteRule ^ledgers/index/([^/]*)/([^/]*)$ /ledgers/index?page=$1&tribe=$2 [L]

但仍然是来自

的输出
die(print_r($this->request->getQueryParams(), true));

Array()

关于如何让它发挥作用的任何想法?

【问题讨论】:

    标签: .htaccess cakephp cakephp-3.x cakephp-3.6


    【解决方案1】:

    您的规则必须在^ index.php [L] 之前定义,因为它会捕获所有内容并且永远不会达到您的规则。特别是在您的情况下,它甚至必须放在 RewriteCond 行之前,因为条件只能适用于单个规则。考虑使用skipping rules 解决方法。

    虽然在内部重写 URL 是可行的,即您将能够访问查询参数,但保持 URL 不变可能会产生负面影响,例如 Router::url() 会产生:

    /ledgers/index/1/2?page=1&tribe=2
    

    代替:

    /ledgers/index?page=1&tribe=2
    

    因此您可能需要考虑发出这样的实际重定向(注意可选的右斜杠和括号内的+ 以匹配整个数字,而不仅仅是最后一个数字):

    RewriteRule ^ledgers/index/(\d+)/(\d+)/?$ /ledgers/index?page=$1&tribe=$2 [NC,L,QSA,R=301]
    

    这将在外部重定向到新的 URL 结构,并使用 QSA 标志它还允许合并可能的现有查询参数,即:

    /ledgers/index/1/2?foo=bar
    

    将重定向到:

    /ledgers/index?page=1&tribe=2&foo=bar
    

    另见

    【讨论】:

      猜你喜欢
      • 2023-02-14
      • 1970-01-01
      • 2015-06-19
      • 2016-08-16
      • 2018-08-26
      • 2015-06-19
      • 2018-03-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多