如何将用户从未重写的URL重写为重写的URL

我有两个url。 一个看起来像这样(这是一个不重写的URL):

  1. www.example.com/article.php?id=12

下一个是这样的(这是一个重写的URL):

  1. www.example.com/article/12

这两个url正在工作。 我想知道的是,如果用户访问第一个URL,他会自动redirect到第二个URL? 我怎样才能做到这一点? 有没有办法做同样的只使用.htaccess文件?

也请帮助,如果我想包括标题也与我这个丑陋的url将看起来像这样。

www.example.com/article.php?id=12&title=sometitle

预计漂亮的url是这样的

www.example.com/article/12/sometitle

我正在使用的redirect规则是这样的

 RewriteRule ^article/(\d+)/([\w-]+)$ article.php?id=$1&title=$2[R=302,L] 

即使他访问丑陋的网页,我也不希望用户看到丑陋的url。

有了这样的redirect,你需要特别小心redirect循环,因为你已经在内部重写 (从/article/12/article.php?id=12 )。 为避免redirect循环,可以根据保存初始请求头的THE_REQUEST服务器variables来检查URL,并且在URL被重写时不会改变。

因此,在内部重写之前,可以在.htaccess文件的顶部附近执行以下操作。

 RewriteCond %{THE_REQUEST} ^[AZ]{3,9}\ /([\w-]+)\.php\?id=(\d+)\ HTTP RewriteRule ^[\w-]+\.php$ /%1/%2? [R=302,L] 

(如果你确定工作正常,将302 (暂时)改为301 (永久)redirect,301s被浏览器caching,这样可能会导致testing有问题,或者,确保你的浏览器caching禁用。

这个?RewriteRule replace的结尾是必需的,以便从请求中删除原始查询。 (或者,您可以使用Apache 2.4+上的QSD标志)

RewriteRule 模式只是一个快速检查,以确保我们只处理看起来像我们想要的目标的URL。 反向引用%1%2引用到CondPattern

模式[\w-]+匹配包含单词字符azAZ09_-文章“名称”。 如果文章名称只是小写字母az则将此模式更改为[az]+ 。 用正则expression式更好地限制。

同样\d+匹配任意数量的数字( 09 )。

更新#1:(从评论)看来,“文章”是字面的单词,而不是代表任何文章的单词。 在这种情况下,上述指令可以被简化:

 RewriteCond %{THE_REQUEST} ^[AZ]{3,9}\ /(article)\.php\?id=(\d+)\ HTTP RewriteRule ^article\.php$ /%1/%2? [R=302,L] 

更新#2:要包含一个“标题”,你可以扩展上面的例子(虽然我不知道为什么你需要这样做)。 所以,要从/article.php?id=12&title=some-titleredirect到/article/12/some-title ,你可以这样做:

 RewriteCond %{THE_REQUEST} ^[AZ]{3,9}\ /(article)\.php\?id=(\d+)&title=([\w-]+)\ HTTP RewriteRule ^article\.php$ /%1/%2/%3? [R=302,L]