自定义CMS,非常像商业CMS的永久链接

时间:2011-12-10 16:16:00

标签: php frameworks content-management-system permalinks

我正在为我的个人项目制作一个非常基本的CMS。对我自己的教育来说,这和任何事情一样重要。我有一个问题是如何在没有文件扩展的情况下实现url / permalink。我理解使用get变量从数据库中提取数据,但是如何将其转换为类似www.url.com/posttitle的内容,而不是像www.url.com/?posttitle='blablabla那样。

同样在一个稍微不同的主题上,任何人都可以指示我使用框架来开发处理会员资格和会员列表的网站,例如craigslist。

我目前在wordpress中开发并且非常有能力,但对基础级别的OOPHP和自定义CMS开发不太熟悉。

提前感谢您的任何帮助或建议。

3 个答案:

答案 0 :(得分:9)

您使用 .htaccess 文件将所有请求传递给前端控制器(通常只是 index.php 脚本),然后该脚本与传入数据库记录的请求。

例如,如果您有一个名为pages的数据库表,其中包含四列:idtitleslugcontent,则以下内容将为一个简单的实现...

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

从这里开始,你可以建立它。

答案 1 :(得分:2)

这可以通过url rewriting(位于网站目录结构根目录中的.htaccess)完成。

或者您可以将所有内容重写到index.php中,然后在此处进行解析。

您只需从$_SERVER变量中获取网址的URI部分(请查看'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]

答案 2 :(得分:2)

无文件扩展通常是URL路径抽象的结果 - 这意味着您的应用程序应该解释URL之后的所有内容并开始基于此呈现数据。

请考虑以下事项:

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

在正常的HTTP请求上(例如,在Apache上),Apache会尝试提供一个名为/about-us的公用文件夹,因为它没有指定,所以是静态index.php文件。

使用任何流行的MVC框架,如CodeIgniter,CakePHP,Ruby on Rails等,/about-us与所谓的路由匹配,后者加载与该页面相关的资产。因此,它不会加载静态页面,而是运行到数据库,抓取该页面的数据,抓取模板,并动态提供文件。这实际上是获取“漂亮”URL的一种方式。

如果您想自己动手,我强烈推荐上述任何一种框架。不过,不要在不理解它们的情况下使用它们 - 尝试了解执行过程是什么。掌握每个请求的确切内容。

就身份验证而言,我知道像Devise和CanCan这样的Rails中有一些选项。这些基本上是预编码的身份验证模块,允许您轻松配置它们。