0

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

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

这是 1.x URL 的示例

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()

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

4

1 回答 1

1

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

虽然在内部重写 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

也可以看看

于 2018-12-18T12:06:18.117 回答