我有一个社交网络,允许用户写博客和提问。我想创建动态URL,通过PHP在URL末尾发布博客或问题的标题。
示例:
www.blah.com/the_title_here
寻找最简洁有效的方法来实现这一目标。
答案 0 :(得分:6)
您通常会将URL友好的“slug”存储在数据库行中,然后使用PHP脚本查找匹配该slug的帖子。
例如,如果您有一个名为index.php
的脚本,该脚本使用了一个名为slug
的参数......
<?php
if (isset($_GET['slug'])) {
$sql = "SELECT * FROM `your_table` WHERE slug = ? LIMIT 1";
$smt = $pdo->prepare($sql);
$smt->execute(array($_GET['slug']));
$row = $smt->fetchObject();
// do something with the matching record here...
}
else {
// display home page
}
...然后您可以使用.htaccess重写请求:
RewriteEngine on
RewriteRule ^(.+)$ index.php?slug=$1
答案 1 :(得分:2)
使用数据库执行此操作将悲伤 :(
在许多情况下,您不需要查找数据库,您将使用此方法。例如: - www.blah.com/signup
(这里没有意义)。数据库连接占用资源,资源严重......
RewriteEngine on
RewriteRule ^(.+)$ index.php?slug=$1
如马丁所示,可以获得路径或slu ..
大多数框架使用文件系统来实现更清晰的URL。 一个文件夹,用于存放所有文件和 在理论上与
类似的东西<?php
$default = "home";
//function to make sure the slug is clean i.e. doesnot contain ../ or something
if(isset($_GET['slug'])) $slug = clean($_GET['slug']);
if(!isset($slug)) $slug = $default;
$files = explode('/',$slug);// or any other function according to your choice
$file = "./commands/".$files[0].".php";
if(file_exists($file))
require_once($file);
else
require_once("./commands/".$default.".php");
你可以根据需要简单到复杂。您甚至可以使用数据库来确定默认情况,就像Martin所做的那样,但这应该在$default
而不是您使用的第一个逻辑......
这样做的好处
site.com/users/piyushmishra
和site.com/forums/mykickassforum
甚至更深层次的site.com/category/category-name/post-name/comments/page-3
./ACLcommands/users.php
,./XMLRPC/ping.php
答案 2 :(得分:1)
有很多开源软件可以执行此操作,您可以查看WordPress.org或MediaWiki.org来执行此操作。您需要.htaccess
或Apache配置设置的组合才能向其添加mod_rewrite
规则。
接下来,您将需要一个控制器文件,如Martin Bean所写,以查找帖子...但请确保您正确地转义/清理/验证输入,否则如果您有JavaScript,则可能容易受到SQL注入或XSS攻击在您的网站上。
所以最好使用id方法,只使用slug进行漂亮的url目的。 WordPress.org软件还表明,只有通过slug才能让它在你有大量帖子后变慢。因此,您可以使用www.blah.com/slug-phrase-goes-before-the-numeric_id
的组合并编写一个RegExp来匹配:.*(\d+)$
答案 3 :(得分:0)
"www.blah.com/$id/".preg_replace('/^[a-z-]+/','',preg_replace('/[ ,;.]+/','-',strtolower($title)))
并仅使用$id
来自标题
"How do I create dynamic URLs?"
它创建了网址
www.blah.com/15/how-do-i-create-dynamic-urls