Как мне написать собственный файл mod_rewrite .htaccess для маршрутизации CakePHP?

Я переписал свое веб-приложение с помощью CakePHP, но теперь мне нужно, чтобы мои старые отформатированные URL-адреса перенаправлялись на мой новый формат URL-адресов. Кажется, я не могу добавить свое собственное правило перезаписи мода. Я добавил его над основным правилом перезаписи cakephp, но получаю бесконечный цикл перенаправления. Я просто хочу, чтобы http://mysite.com/index.php?action=showstream&nickname=user перенаправлял на http://mysite.com/user до того, как произойдет перезапись cakephp.

РЕДАКТИРОВАТЬ: Хорошо, теперь, когда условие выполнено, он перенаправляет, но добавляет исходную строку запроса в конец. Я предполагаю, что это из-за флага QSA в правилах перезаписи CakePHP, но у меня создалось впечатление, что буква «L» в моем правиле остановит выполнение этого ...

RewriteEngine On

RewriteCond %{QUERY_STRING} ^action\=showstream&nickname\=(.*)$
RewriteRule ^.*$ http://mysite.com/%1 [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]

Ответов (2)

Когда вы выполняете захват внутри строки RewriteCond вместо RewriteRule, вы должны ссылаться на захват с помощью% N вместо $ N. То есть ваша строка RewriteRule должна быть:

RewriteRule ^index.php$ /%1 [R=301,L]

Попробуйте протестировать строку запроса ( THE_REQUEST ), чтобы узнать, какой URI был запрошен изначально:

RewriteCond %{THE_REQUEST} ^[A-Z]+\ /index\.php
RewriteCond %{QUERY_STRING} ^action=showstream&nickname=([^&]*)$
RewriteRule ^index\.php$ /%1? [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule .* index.php?url=$0 [QSA,L]

Но, возможно, было бы проще сделать это с помощью PHP.