Перенаправить / .htaccess, чтобы изменить старые URL-адреса параметров PHP на SEO-дружественные URL-адреса CakePHP? - PullRequest
0 голосов
/ 24 октября 2010

Я собираюсь обновить свой сайт, чтобы использовать 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?

1 Ответ

4 голосов
/ 24 октября 2010

С помощью RewriteRule вы можете проверить только путь URI, но не запрос:

Шаблон будет изначально сопоставляться с частьюURL-адрес после имени хоста и порта, а также перед строкой запроса.Если вы хотите сопоставить имя хоста, порт или строку запроса, используйте RewriteCond с переменными %{HTTP_HOST}, %{SERVER_PORT} или %{QUERY_STRING} соответственно.

Итак:

RewriteCond %{QUERY_STRING} ^action=view&item=([0-9]+)$
RewriteRule ^index\.php$ /index.php?url=item/%1 [R=301,L]
...