2012-02-17 2 views
0

У меня есть вопрос о «системе управления ссылками» на PHP. Идея состоит в том, чтобы создать скрипт, который мог бы создавать разные ссылки, чем оригинал - что-то вроде дружеских ссылок с .htaccess. В .htaccess make правило перенаправляет весь трафик на файл сценария - например, linkprocessor.php, тогда в этом файле должны быть некоторые условия, mysql connect и grabber от базы данных (дружественные и оригинальные столбцы). Поэтому, если мы напишем полный адрес - example.com/defined-address, он перенаправляет нас (но не меняет адрес) на linkprocessor.php, а затем скрипт проверяет, находится ли/defined-address в базе данных, если он будет содержать определенные (на основе on friendlyurl) оригинальныйurl файл. Этот сценарий будет оптимальным? Этот скрипт может помешать «хакерам».Система управления ссылками на PHP

Пример:

example.com/defined-address -> linkprocessor.php -> SELECT originalurl из таблицы, где friendlyurl =/определен-адрес -> включают в себя originalurl

=> можно записать некогерентно, но его трудно объяснить, что точно

ответ

2

Что вы спрашиваете здесь, это шаблон переднего контроллера http://en.wikipedia.org/wiki/Front_controller.

Существуют различные способы его реализации, используя базу данных sql для сопоставления строк URI с файлами, которые необходимо включить, является допустимым способом ее выполнения, но может быть излишним. Возможно, такая же информация может быть жестко закодирована в массиве php.

Стандартный способ предотвращения взлома заключается в том, чтобы включить только белые списки. В вашем случае вы используете явную карту, чтобы определить, какую страницу включить, поэтому это не проблема.

Некоторый код, чтобы вы начали:

<?php 

$map = array('/home' => 'included_1', '/details' => 'included_2' ...) 

if (array_key_exists($_SERVER['REQUEST_URI'], $map)) { 
    include $map[$_SERVER['REQUEST_URI']] 
} 
else { 
    // Send a 404 response 
} 
+0

Я думал, похож, что если там будет GET? Include не может включать файлы с get (file.php? X = asd). Должен ли я взорвать requestUri? и включить только файл без get? – user1112008

+0

@ user1112008 взрыва будет работать, я бы, вероятно, использовал substr с strpos вместо того, чтобы взорваться, чтобы усечь URI при первом возникновении '?' так как вам не нужно хранить другие разделы строки URI. – erm410

2

Что вы ищете, это шаблон дизайна переднего конца контроллера.

Вы описали базовый метод решения этого вопроса, который должен перенаправить все входящие запросы (минус запросы на статическое содержимое, такие как изображения, файлы CSS и файлы JS) в один файл. Обычно этот файл является файлом index.php в корневом каталоге сайта, но может быть любым файлом.

Вы можете выполнить это перенаправление с использованием .htaccess на серверах Apache или web.config на серверах IIS. Для .htaccess вы можете отправить mod_rewrite и получить информацию, которая поможет вам.

После того, как все запросы направлены на ваш контроллер фронтального интерфейса, вам необходимо определить, что запрашивает запрос. Вы можете проверить PHP $_SERVER['REQUEST_URI'], чтобы узнать, что это за запрос, и обрабатывать его соответствующим образом.

Наиболее распространенные решения этой проблемы, которые я видел, зависят от того, что контроллеры (классы) находятся в определенном месте и «статические» файлы находятся в отдельном месте. Делая какие-нибудь вроде следующего бы тривиально легко расширить запросы, что ваш сайт будет отвечать на:

/** 
    I am assuming at this point that the variable $request is an array 
    representing the current request. For example, if the request is for: 
    http://www.example.com/dir/page, $request will contain two entries, 
    'dir' and 'page' 
**/ 

if(file_exists('/controllers/' . $request[0] . '.php')) { 
    require_once '/controllers/' . $request[0] . '.php'; 
    $controller = new $request[0](); 
    $controller->dispatch($request); 
} else if(file_exists('/static/'.$request[0] . '.php')) { 
    require_once '/static/' . $request[0] . '.php'; 
} else 
    throw new Exception('404', 404); 

выше более псевдокода, чем фактический код, я не гарантирую, что это будет реально работать, но идея есть.

Чтобы добавить еще один контроллер в свою систему, вы просто напишите класс, убедитесь, что он имеет метод dispatch и поместите его в нужное место.

Смежные вопросы