如何重写这样的网址?

时间:2010-09-07 10:08:20

标签: php apache .htaccess mod-rewrite url-rewriting

我将如何重写(对于我博客中的每个帖子):

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/

3 个答案:

答案 0 :(得分:2)

尝试此规则:

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

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

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

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

这意味着它必须是独一无二的。否则,标题无法明确地映射到数字ID。在这种情况下,如果您将标题传递给 post.php ,标题肯定会更容易:

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

显然,由于标题是唯一的,因此您不再需要数字ID。

答案 1 :(得分:1)

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

您的第一个示例非常简单,因为重写的URL只需要在正确的位置包含ID即可。之前的答案已经提供了一个可行的解决方案。

第二个示例(即没有重写URL中的ID)需要修改底层PHP以查询数据库以查找页面标题而不是ID(这可能会对您的网站产生性能影响,具体取决于方式你已经写过了。)或者,您可以为每个单独的URL设置特定的重写规则,但这仍然是维护的开销。

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

好消息是,如果你使用的是Wordpress或Drupal等CMS产品,它们内置了URL重写功能,所以你根本不需要乱用服务器配置。

希望有所帮助。

答案 2 :(得分:1)

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