2011-12-10 46 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。這些基本上是預先編碼的認證模塊,可讓您輕鬆配置它們。