Пользовательская CMS, довольно постоянные ссылки, как коммерческая CMS - PullRequest
5 голосов
/ 10 декабря 2011

В настоящее время я создаю очень простую CMS для моего личного проекта.Это столько же для моего образования, сколько для меня.У меня есть один вопрос: как мне получить URL / постоянные ссылки без расширений файлов?Я понимаю, как использовать переменные get для извлечения данных из БД, но как конвертировать это в нечто вроде www.url.com/posttitle вместо чего-то вроде www.url.com/?posttitle='blablabla.

Такжена немного другую тему может кто-нибудь указать мне, в направлении EASY, использовать фреймворк для разработки сайтов, которые имеют дело с членством и списками участников, например, craigslist.

В настоящее время я занимаюсь разработкой в ​​WordPress и вполне способен, но менее знакомс OOPHP и разработкой собственной CMS с базового уровня.

Заранее благодарим за любую помощь или предложения.

Ответы [ 3 ]

9 голосов
/ 10 декабря 2011

Вы бы использовали файл .htaccess для передачи всех запросов на ваш фронт-контроллер (обычно это просто скрипт index.php ), а затем этот сценарий соответствует входящему запросу.к записи в вашей базе данных.

Например, если у вас есть таблица базы данных с именем pages с четырьмя столбцами: id, title, slug и content, следующее будетпростая реализация…

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)$ index.php/$1 [NC,L]

Это заставляет Apache принимать все запросы, которые не являются файлом или направлением, и отправлять их на index.php .

Ваш index.php может выглядеть следующим образом:

<?php
// Take request URI
// Would be something like 'your-slug'
$request = trim($_SERVER['REQUEST_URI'], '/');

// Set up database connection and attempt to match slug
$sql = "SELECT * FROM pages WHERE slug = ? LIMIT 1";
$smt = $db->prepare($sql);
$smt->execute(array($request));

$page = $smt->fetchObject();

if (! $page) {
    // Page was not found matching slug
    header('HTTP/1.1 404 Not Found');
    exit;
}

// Display matching page in a template

Отсюда вы можете использовать его.

2 голосов
/ 10 декабря 2011

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

Обратите внимание на следующее:

http://www.url.com/about-us

При обычном HTTP-запросе (например, в Apache) Apache будет пытаться обслуживать общую папку с именем /about-us, а поскольку она не указана, - статический файл index.php.

С любой из популярных платформ MVC, таких как CodeIgniter, CakePHP, Ruby on Rails и т. Д., /about-us сопоставляется с тем, что называется маршрутом, который загружает ресурсы, относящиеся к этой странице. Таким образом, вместо загрузки статической страницы, она заканчивается в базе данных, получает данные для этой страницы, шаблон и динамически обслуживает файл. По сути, это один из способов получить «красивые» URL.

Если вы хотите накатить свои собственные, я настоятельно рекомендую любой из вышеперечисленных фреймворков. Не просто используйте их, не понимая их, - попробуйте понять, каков процесс выполнения. Получить представление о том, что именно делает каждый запрос.

Что касается аутентификации, я знаю, что в Rails есть несколько опций, таких как Devise и CanCan. Это в основном предварительно кодированные модули аутентификации, которые позволяют легко их настраивать.

2 голосов
/ 10 декабря 2011

Это можно сделать просто через переписывание URL (в .htaccess, расположенном в корне структуры каталогов вашего сайта).

Или вы можете переписать все, например, в ваш index.phpа затем проанализируйте его здесь.

Вы просто получаете URI-часть URL-адреса из переменной $ _ SERVER (посмотрите на 'QUERY_STRING' или просто var_dump($_SERVER), чтобы увидеть, какой ключ содержитчто).

Вот пример файла .htaccess для перезаписи всего:

RewriteEngine on
# rewrite everything except for assets to index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule !\.(js|ico|gif|jpg|png|css)$ /index.php [L]
...