2011-12-10 42 views
4

我目前正在掀起一个非常基本的CMS为我的个人项目。对于我自己的教育来说,这与任何事情一样。我有一个问题是如何在没有文件扩展的情况下实现url/permalinks。我理解使用获取变量从数据库中提取数据,但是如何将其转换为诸如www.url.com/posttitle之类的内容,而不是诸如www.url.com/?posttitle='blablabla之类的内容。自定义内容管理系统,漂亮的固定链接,如商业CMS

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

我目前在wordpress中开发并且功能很强大,但对基本级别的OOPHP和自定义CMS开发不太熟悉。

在此先感谢您的任何帮助或建议。

+0

可能重复的[漂亮的URL在PHP框架](http://stackoverflow.com/questions/8440490/pretty-urls-in-php-frameworks) – mario

+0

可能重复的[漂亮的URL的Web应用程序](http: //stackoverflow.com/questions/5142095/pretty-urls-for-web-application) – mario

回答

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 

从这里,你就可以建立在它。

2

这可以简单地通过url rewriting(位于您的网站目录结构根目录中的.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] 
2

文件的扩展名少通常是URL路径的抽象的结果 - 这是什么意思是,你的应用程序应该在以后的一切解释网址并开始基于此呈现数据。

考虑以下几点:

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

在一个正常的HTTP请求(在Apache,例如),阿帕奇将试图成为所谓/about-us一个公共文件夹,因为没有规定吧,静态index.php文件。

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

如果你想推出自己的产品,我强烈推荐以上任何框架。不过,不要在不理解它们的情况下使用它们 - 尽量了解执行过程是什么。掌握每个请求的确切含义。

就验证过程而言,我知道Rails中有几个选项,如Devise和CanCan。这些基本上是预先编码的认证模块,可让您轻松配置它们。