不知道如何让mod_rewrite写入某种格式

时间:2011-03-27 18:19:13

标签: php mysql mod-rewrite blogs

我正在尝试了解如何正确使用mod_rewrite。我的数据库中有帖子有标题和日期。现在我正在使用mysite.com/post.php?id=3来检索我的帖子数据并填充页面。我想这样:mysite.com/2011/03/27/my-title-like-so/。我猜我必须查询我的数据库以外的其他ID,但我不知道。有人可以帮忙吗?也许我看起来非常简单。到目前为止,我有这样的表现:mysite.com/post/2/,但这没有多大帮助:P

谢谢!

3 个答案:

答案 0 :(得分:1)

通常的做法是在URL中包含ID和标题/日期。这样它对搜索引擎看起来很不错,你仍然可以通过ID有效地检索它。例如,查看此stackoverflow问题的URL。

http://stackoverflow.com/questions/5451267/not-sure-how-to-get-mod-rewrite-to-write-to-a-certain-format

只是猜测,但URL中的数字可能是生成的ID。因此,您使用ID并忽略URL的其余部分,例如:

RewriteRule /questions/(\d+) question.php?id=$1

答案 1 :(得分:1)

如果您不希望在网址中包含ID,那么我建议采用以下方法。

在“帖子”表格中,添加一个“网址”(或“友好”或其他内容)字段,其中包含您希望您的帖子被访问的网址。插入帖子时,只需删除所有非单词字符并将其替换为“ - ”。

然后,当网址进入您的系统时,您可以直接将此网址映射到“网址”字段。

因此,使用您的示例,您的网址为http://mysite.com/2011/03/27/my-title-like-so/ “url”字段将包含“my-title-like-so”。

您可以使用简单的重写规则,例如:

RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f # if requesting file that doesn't exist, use the rule below
RewriteCond %{REQUEST_FILENAME} !-d # if requesting a directory that doesn't exist, use the rule below
RewriteRule ^(.*)$ index.php?myvar=$1 [L,QSA]

这会将URL的内容放在域之后:

http://mysite.com/[catches everything here]

并将它作为'myvar'

存储在$ _GET全局中

然后你可以在php中对该URL进行任何处理:

$url_string = my_sanitising_code($_GET['myvar']);
$url_array = explode('/', $url_string);

现在你有一个URL的所有部分的数组,你可以随心所欲地做任何事情。

答案 2 :(得分:1)

您必须捕获传递给引擎的值以提取所需的数据。所以:

RewriteRule ^([0-9]{4})/([0-9]{2})/([0-9]{2})/(.*)$ fetch.php?year=$1&month=$2&day=$3&title=$4 [L]

应符合您的格式。 然后http://mysite.com/fetch.php可以使用$_GET的值来获取数据库并显示好的东西。