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

Смотрите также

Другие вопросы по тегам