Перезапись URL в PHP MVC Framework - PullRequest
1 голос
/ 12 ноября 2009

Я создал свой собственный php-фреймворк, который реализует шаблон проектирования MVC. В нем все URL построены так:

mysite.com/index.php?route=controller/function/parameters/go/here
mysite.com/index.php?route=products/shirts/99

и т.д.

Я установил htaccess для удаления index.php? Route = part из URL, чтобы сделать их больше SEF заставляет их выглядеть так:

mysite.com/controller/function/parameters/go/here
mysite.com/products/shirts/99

Я просто хочу добавить суффикс в конце каждого URL, например:

mysite.com/controller/function/parameters/go/here.html
mysite.com/products/shirts/99.html

Возможно, htaccess можно использовать для получения этого или, возможно, некоторые другие решения.

Есть идеи, пожалуйста?

Заранее спасибо.

Ответы [ 4 ]

2 голосов
/ 12 ноября 2009

Если я вас правильно понимаю, вы говорите, что использовали htaccess для удаления route = и хотите также удалить суффикс .html. Я думаю, что вы подходите к этому неправильно.

Я хотел бы, чтобы все ссылки в вашем приложении указывали на предпочитаемые вами URL, а затем имел бы htaccess PUT IN в route = и элементы index.php

Так что ссылка выглядит так:

<a href="mysite.com/controller/function/parameters/go/here.html" />

и вы можете использовать правило htaccess, аналогичное тонне Ники, преобразовав его в:

mysite.com/index.php?route=controller/function/parameters/go/here.html

На самом деле Nicky's будет работать нормально. У вас есть возможность удалить суффикс .html в вашем коде index.php или из правила htaccess - на мой взгляд, проще с PHP.

Если вы хотите удалить .html с помощью htaccess, возможно, это будет работать (не проверено):

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)\.html$ index.php?route=$1 [QSA,L]
</IfModule>
2 голосов
/ 12 ноября 2009

Я предполагаю, что вы берете «хорошие» URL-адреса, а затем переписываете их в свой index.php с запросом, переписанным в get var или «route».

Есть некоторые проблемы, с которыми вы столкнетесь в будущем, одна из них будет о том, как справиться с get vars в запросе (если я вспомню, что имел дело с подобной концепцией несколько лет назад).

Лично я бы просто настроил ваш .htaccess для отправки всех запросов, которые не являются действительными файлами / каталогами, в ваш файл bootstrap / index.php. Затем выполните синтаксический анализ в PHP, а не в слишком сложном mod_rewrite. Вы уже анализируете 'route' get var, почему бы просто не проанализировать весь запрос?

На этом этапе первый шаг вашего файла index.php будет следующим:

  • Удалить. расширение (или определить запрос как html / xml / json / etc)
  • Удалить все виды базовых URL.
  • Разобрать остаток так же, как вы делаете маршрут, получите var.
1 голос
/ 14 ноября 2009

Как и другие, я думаю, что добавление должно произойти в вашей структуре.

Я полагаю, что у вас есть такая функция: $ Html-> ссылка ( 'товары / рубашки / 99');

Эта функция должна добавить '.html'.

Ваш обработчик URL должен выглядеть так:

// $ query products / shirts / 99.html

$ l = взорваться ($ query, '/'); $ last = длина ($ l); $ l [$ last-1] = substring ($ l [$ last-1], find ($ l [$ last-1], '. html')) // Я делаю аргументы из памяти, поэтому, пожалуйста, проверьте их .

Вот как будет изменен index.php в CakePHP. Я предлагаю вам взглянуть на этот код в качестве руководства.

0 голосов
/ 12 ноября 2009

Я не эксперт, но попробуйте это:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php?route=$1 [QSA,L]
</IfModule>
...