2010-09-07 31 views
0

我将如何改写(在我的博客每个职位):如何重写这样的网址?

http://localhost/post.php?id=13 

to 

http://localhost/this-is-the-title-of-the-post/13 

AND(无ID)

http://localhost/post.php?id=13 

to 

http://localhost/this-is-the-title-of-the-post/ 

回答

2

试试这个规则:

RewriteEngine on 
RewriteRule ^[^/]+/(\d+)$ post.php?id=$1 

这将改写请求URI路径如/this-is-the-title-of-the-post/13内部为/post.php?id=13;所以这与你所描述的相反。但这就是mod_rewrite的工作方式:只能更改传入请求而不传出响应。

现在如果你想省略数字ID,你的标题必须是新的ID:

RewriteRule ^this-is-the-title-of-the-post/(13)?$ post.php?id=13 

这意味着它必须是唯一的。否则标题不能明确地映射到数字ID。

RewriteCond %{REQUEST_FILENAEM} !-f 
RewriteRule ^([^/]+)/$ post.php?title=$1 

很明显,因为标题是独一无二的,你不需要数字ID更多:在这种情况下,如果你通过标题post.php中标题肯定会更容易些。

1

mod_rewrite是一个Apache模块,它允许您使用正则表达式来执行此操作。如果您使用的是Windows/IIS Web服务器,则您将拥有完全不同的技术;我会坚持使用Apache。

你的第一个例子很简单,因为重写的URL只需要在正确的位置包含ID就可以工作。以前的答案已经给出了一个可行的解决方案。

第二个示例(即没有重写URL中的ID)需要您修改您的基础PHP以查询数据库以查找页面标题而不是ID(这可能会影响您的站点的性能,具体取决于你是怎么写的)。或者,您可以对每个单独的URL都有一个特定的重写规则,但这是相当的维护开销。

mod_rewrite的坏消息是,它可能是一个非常黑暗的艺术,让它工作,特别是如果你不擅长正则表达式。麻烦的是,如果它不起作用,那么只会在浏览器中出现服务器配置错误,并且调试起来可能非常困难。如果你愿意坚持下去,这是值得的,但对于初学者来说,这可能令人沮丧。

好消息是,如果您使用的是CMS产品(如Wordpress或Drupal),则它们具有内置的URL重写功能,因此您根本不需要混淆服务器配置。

希望有所帮助。

1

如果你只想要纯文本的URL(在URL中没有PK参考),你必须在数据库中实现唯一的SLUG字段(对于日期来说可以是唯一的,就像wordpress一样)。
我建议将所有请求重定向到与index.php不匹配的现有文件,并处理$ _SERVER ['REQUEST_URI']并避免处理mod_rewrite magick(长期导致无法通过的和magick代码)。 mod_rewrite rule for this