CakePHP 3.x使用htaccess重写目录作为分页查询参数

时间:2018-12-18 11:30:45

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

我正在将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()

关于如何使它工作的任何想法?

1 个答案:

答案 0 :(得分: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

另请参见