CakePHP 3.x использует htaccess для перезаписи каталогов в качестве параметров запроса разбивки на страницы - PullRequest
0 голосов
/ 18 декабря 2018

Я обновляю проект 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()

Я видел веще один пост 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 голосов
/ 18 декабря 2018

Ваше правило должно быть определено до ^ 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

См. также

...