自定义CMS,像商业CMS一样漂亮的永久链接


Custom CMS, pretty permalinks like commercial CMS

我目前正在为我的个人项目制作一个非常基本的CMS。这对我自己的教育同样重要。我有一个问题是如何实现url的/永久链接没有文件扩展名。我理解使用get变量从数据库中提取数据,但如何将其转换为www.url.com/posttitle而不是www.url.com/?posttitle='blablabla。

同样在一个稍微不同的话题上,谁能给我指出一个易于使用的框架,用于开发处理会员资格和成员列表的网站,如craigslist。

我目前在wordpress内开发,我很有能力,但从基础层面对OOPHP和自定义CMS开发不太熟悉。

提前感谢您的帮助和建议。

您将使用。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

这可以通过url重写来完成(在。htaccess中放置在你的网站目录结构的根目录中)。

或者你可以将所有内容重写为index.php,然后在这里解析。

您只需从$_SERVER变量中获取url的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]

无文件扩展通常是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中有一些选项,如设计和CanCan。这些基本上是预先编码的身份验证模块,允许您轻松地配置它们。