CakePHP 3.x использует htaccess для перезаписи каталогов в качестве параметров запроса разбивки на страницы
Я обновляю проект CakePHP 1.x до CakePHP 3.x
Проект 1.x имеет URL-адреса, которые публикуются в местах, которые мы не можем изменить, например, в книгах, поэтому мне нужно переписать предыдущие 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>
Вот как выглядят URL 3.x
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()
Я видел в другом посте Stackru, чтобы попытаться использовать
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 ответ
Ваше правило должно быть определено до ^ 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
Смотрите также