我正在将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()
关于如何使它工作的任何想法?
答案 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
另请参见