Я собираюсь обновить свой сайт, чтобы использовать CakePHP вместо старого доморощенного фреймворка. Мне нужно написать файл HTAccess, чтобы перенаправить старые URL-адреса параметров PHP на новые URL-адреса, оптимизированные для CakePHP, но я не могу заставить его работать.
Мой файл htacess (тот, который находится в app / webroot) на данный момент выглядит так:
RewriteEngine On
RewriteRule ^index.php?action=view&item=172$ index.php?url=item/172 [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
Это не работает. Я попытался удалить L и просто перенаправить его на item / 172, но это тоже не сработало. Текущий обнуляется с параметром URL, не установленным, и если я смотрю в $ _SERVER ['REQUEST_URI'], он не изменяется. Хотя я не знаю, изменит ли это mod_rewrite. Мое правило перезаписи, похоже, не активируется, хотя оно прямо скопировано из строки URL моего браузера. Я попробовал это без и с ведущим /
. Без кубиков.
Что здесь происходит?
И как я могу написать более обобщенный URL для преобразования? Я пробовал что-то вроде:
RewriteRule ^index.php?action=view&item=([0-9]+)$ index.php?url=items/$1 [R=301,L]
Но это тоже не сработало. Что я делаю не так?
РЕДАКТИРОВАТЬ Это положительно бесит.
RewriteRule ^(.*)$ /index.php?url=item/172 [R=301]
Это работает. Он направляет ВСЕ URL в правильно сформированный Cake url. Какой процессор торта тогда подхватывает и как-то обрабатывает. Я не уверен, как он пропускает второе правило переписывания Cake, но это так. Попытка это:
RewriteRule ^(.*)$ item/172 [R=301]
Возвращает неправильно сформированное перенаправление, как и указание последнего на предыдущем:
RewriteRule ^(.*)$ /index.php?url=item/172 [R=301,L]
Это говорит о том, что оно никогда не сможет завершиться.
Так что я на самом деле довольно озадачен, почему этот:
RewriteRule ^(.*)$ /index.php?url=item/172 [R=301]
Возвращает правильный URL-адрес Cake, но это происходит, и он отправляется на правильную страницу. Тем не мение,
как только я пытаюсь изменить первую часть, она перестает работать.
Подождите секунду. Когда он достигает ?
, он начинает терпеть неудачу. Он успешно соответствует index.php
, но не index.php?
Но выход из него не имеет значения.
RewriteRule ^index.php\?$ /index.php?url=item/172 [R=301]
Не соответствует или не возвращает правильный URL. И это, похоже, не соответствует нормальному улову Cake, потому что $_GET['url']
пусто. Как вы избегаете символов параметров для буквального совпадения в mod_rewrite?