繁体   English   中英

如何重写这样的网址?

[英]How to rewrite urls like this?

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

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/

尝试以下规则:

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

这会将请求的URI路径(如/this-is-the-title-of-the-post/13内部/post.php?id=13/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。

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

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

第二个示例(即,重写的URL中没有ID)将需要您修改基础的PHP,以查询数据库以查找页面标题而不是ID(这可能会对您的网站产生性能影响,具体取决于您的操作方式)写下来)。 或者,您可以为每个单独的URL设置一个特定的重写规则,但这是维护的相当大的开销。

使用mod_rewrite的坏消息是,要使其正常工作可能是一项艰巨的任务,特别是如果您对正则表达式不满意的话。 问题是,如果它不起作用,您只会在浏览器中收到服务器配置错误,并且调试起来非常困难。 如果您愿意坚持不懈,那是值得的,但是对于初学者来说,这可能会令人沮丧。

好消息是,如果您使用的是CMS产品(如Wordpress或Drupal),则这些产品都内置了URL重写功能,因此您完全不需要弄乱服务器配置。

希望能有所帮助。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM