PHP动态数据库页面重写URL

时间:2012-06-13 20:05:14

标签: php url-rewriting dynamic-pages

如何制作www.mydomain.com/folder/?id=123 ---> www.mydomain.com/folder/xCkLbgGge

我希望我的数据库查询页面能够获得它自己的URL,就像我在推特等上看到的那样。

3 个答案:

答案 0 :(得分:7)

这被称为“slug”wordpress使这个词流行。不管怎么说。

最终你需要做的是拥有一个.htaccess文件来捕获你所有的传入流量,然后在服务器级别对其进行改造以便在某种意义上使用你的PHP,你仍然可以保持?id = 123逻辑不变,但是到客户端'/ folder / FHJKD /'将是可查看的结果。

这是一个.htaccess文件的例子,我在...上使用了类似的逻辑。(对于那个问题,wordpress也是如此)。

RewriteEngine On
#strips the www out of the domain if there
RewriteCond %{HTTP_HOST} ^www\.domain\.com$

#applies logic that changes the domain from http://mydomain.com/post/my-article
#to resemble http://mydomain.com/?id=post/my-article
RewriteRule ^(.*)$ http://domain.com/$1 [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?id=$1 [QSA,L]

这将做什么是在domain.com/之后将所有内容作为变量传递给index.php,此示例中的变量将是'id',因此您必须设置最适合您网站需求的逻辑。

例如

<?php
 //the URL for the example here: http://mydomain.com/?id=post/my-article
 if($_GET['id'])
 {
   $myParams = explode('/', $_GET['id']);
   echo '<pre>';
   print_r($myParams);
   echo '</pre>';
 }
?>

现在这个逻辑必须更深入,这只是一个基本层面的纯粹例子,但总的来说,特别是因为你假设你使用数据库,你想要确保$ myParams是恶意的代码,可以注入您的PHP或数据库。

上述$myParams来自print_r()的输出将为:

Array(
   [0] => post
   [1] => my-article
)

要使用它,您至少需要做

echo $myParams[0].'<br />';

或者您可以这样做,因为大多数浏览器都会添加最终/

<?php
 //the URL for the example here: http://mydomain.com/?id=post/my-article
 if($_GET['id'])
 {
   //breaks the variable apart, removes any empty array values and reorders the index
   $myParams = array_values(array_filter(explode('/', $_GET['id'])));
   if(count($myParams > 1)
   {
       $sql = "SELECT * FROM post_table WHERE slug = '".mysql_real_escape_string($myParams[1])."'";
       $result = mysql_query($sql);
   }

 }
?>

现在这是一个非常粗略的例子,你会希望在那里使用一些逻辑来防止mysql注入,然后你将像你现在如何使用id = 123来引用你的文章一样应用查询

或者你也可以走一条完全不同的路线,探索MVC(模型视图控制)的奇迹。像CodeIgniter这样的东西是一个很好的简单的MVC框架,可以开始使用。但这取决于你。

答案 1 :(得分:3)

这可以通过mod_rewrite实现,例如通过.htaccess文件。

答案 2 :(得分:1)

在你的.htacess中,你需要添加RewriteEngine。

在那之后,你需要做一些正则表达式来使这个小野兽工作。我假设?id是folder.php?id = 123。

例如文件夹片段:RewriteRule ^文件夹/([a-zA-Z0-9 _-] +)/([0-9] +)。html $ folder.php?id = $ 123