【发布时间】:2011-10-21 05:54:02
【问题描述】:
我有一个允许用户写博客和提问的社交网络。我想创建动态 URL,通过 PHP 在 URL 的末尾发布博客的标题或问题。
例子:
www.blah.com/the_title_here
寻找最干净最有效的方法来完成此任务。
【问题讨论】:
我有一个允许用户写博客和提问的社交网络。我想创建动态 URL,通过 PHP 在 URL 的末尾发布博客的标题或问题。
例子:
www.blah.com/the_title_here
寻找最干净最有效的方法来完成此任务。
【问题讨论】:
使用数据库来做到这一点会是悲伤 :(
在很多情况下,您不需要查找数据库,而您将使用此方法。例如:-www.blah.com/signup(这里没有意义)。而且数据库连接会消耗资源,严重的资源......
RewriteEngine on
RewriteRule ^(.+)$ index.php?slug=$1
如马丁所示,为您提供路径或蛞蝓。
大多数框架使用文件系统来实现更清晰的 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
【讨论】:
"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
【讨论】:
有很多开源软件可以做到这一点,您可以查看 WordPress.org 或 MediaWiki.org 来做到这一点。您需要结合使用 .htaccess 或 Apache 配置设置来向它们添加 mod_rewrite 规则。
接下来,您将需要 Martin Bean 所写的控制器文件来查找帖子...但请确保正确转义/清理/验证输入,否则如果您有 JavaScript,则可能容易受到 SQL 注入或 XSS 攻击在您的网站上。
所以最好使用 id 方法,并且只将 slug 用于漂亮的 url 目的。 WordPress.org 软件还建议,一旦您有很多帖子,仅靠蛞蝓就会变慢。因此,您可以使用www.blah.com/slug-phrase-goes-before-the-numeric_id 的组合并编写一个正则表达式来匹配:.*(\d+)$
【讨论】:
您通常会将 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
【讨论】: