Безопасная маршрутизация в моем собственном фреймворке с использованием PHP - как - PullRequest
1 голос
/ 31 октября 2010

Как почти каждый программист, я пишу свой собственный PHP-фреймворк для образовательных целей.А теперь я смотрю на проблему с разбором URL для маршрутизации MVC.

Framework будет использовать удобные URL везде.Но вопрос в том, как их разобрать во фронт-контроллере.Например, ссылка /foo/bar/aaa/bbb может означать «Вызовите панель действий foo контроллера и передайте параметр aaa со значением bbb. Но в случае, если кто-то установит каркас в подкаталог корневого домена, часть каталога должна быть удалена перед определением имени контроллера иимя действия. И я ищу способ сделать это безопасно.

Также я хотел бы поддержать запасной вариант, если перезапись URL не поддерживается на сервере.

В разных системахопределены различные наборы переменных $ _SERVER.Например, на моем локальном компьютере из набора PATH_INFO, REQUEST_URI, REQUEST_URL, ORIG_REQUEST_URI, SCRIPT_NAME, PHP_SELF только REQUEST_URI, SCRIPT_NAME и PHP_SELF определены, интересно, если я могу, если я могу.

У зрелых фреймворков, таких как Symfony или ZF, есть несколько сложных алгоритмов парсинга URL-адресов (по крайней мере, так оно и есть). Поэтому я не могу просто взять оттуда часть для *. 1010 *

Ответы [ 4 ]

2 голосов
/ 31 октября 2010

Два обходных пути:

  1. Добавьте переменную config с каталогом url / instalation в ваше приложение и удалите ее из $_SERVER['REQUEST_URI']
  2. Заставьте apache переписать его, чтобы получить переменную

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule (.*) index.php?myrequest=$1 [QSA,L]
    
1 голос
/ 31 октября 2010

Я обычно использую следующее для определения базового пути URL приложения, при условии, что все ваши запросы всегда проходят через один и тот же сценарий шлюза:

$base = dirname($_SERVER['PHP_SELF']);

Для вашего второго вопроса, если вы хотите проверить, включен ли mod_rewrite, вы можете использовать:

if (in_array('mod_rewrite', apache_get_modules())) {
   // rewrite is enabled
}

Однако это не обязательно означает, что RewriteEngine включен, поэтому вам, вероятно, следует использовать дополнительное условие:

if (in_array('mod_rewrite', apache_get_modules()) &&
    preg_match('/RewriteEngine +On/i', file_get_contents('/path/to/.htaccess'))) {
   // rewrite is enabled and active
}
1 голос
/ 31 октября 2010

Я сейчас занимаюсь тем же исследованием.Но все, что я вижу, настолько сложно, что, скорее всего, я все равно продолжу использовать mod_rewrite.В конце концов вы получаете то же самое, скорее вы используете SEF с PHP или mod_rewrite с apache.В любом случае, я буду следить за этой темой ... это интересно :) Надеюсь, что у php-гуру здесь есть больше информации об этом:)

Edit:
Это действительно зависит от того, чтоты хочешь сделать.Для своих нужд я жестко закодировал большинство страниц, чтобы они выглядели SEF.Но что-то вроде приведенного ниже примера также должно работать.

RewriteEngine on
RewriteRule ^/posts/([A-Za-z0-9_\-]+)/([A-Za-z0-9_\-]+)\.html$ posts.php?$1=$2 [NC]

В этом примере выше:

http://localhost/posts/view/23 
http://localhost/posts/delete/23

равно:

http://localhost/posts.php?view=23
http://localhost/posts.php?delete=23

Это действительно зависитна то, что именно вы делаете :) Пример выше должен работать, но я не проверял их.

0 голосов
/ 31 октября 2010

Возможно, вы могли бы взять PHP_SELF и удалить первые n символов, где n - это длина SCRIPT_NAME.

Редактировать: Упс ... похоже, вы можете просто взять PHP_SELF: http://php.about.com/od/learnphp/qt/_SERVER_PHP.htm

...