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

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

我有两个 URL。其中一个看起来像这样(非重写 URL):

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

下一个看起来像这样(重写的 URL):

  1. www.example.com/article/12

两个 URL 均有效。我想知道的是,如果用户访问第一个 URL,他是否可以自动重定向到第二个 URL?我该如何实现这一点?有没有办法仅使用.htaccess文件来实现相同的效果?

另外,如果我想包含标题,请帮忙,我的丑陋的 URL 将会看起来像这样。

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

预期的漂亮网址如下

www.example.com/article/12/sometitle

我使用的重定向规则如下所示

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

我不希望用户看到这个丑陋的网址,即使他也访问了这个丑陋的网址。

答案1

对于这样的重定向,你需要格外小心重定向循环,因为你已经内部重写反之亦然(从/article/12/article.php?id=12)。为了避免重定向循环,您可以根据服务器变量检查 URL THE_REQUEST,该变量保存初始请求标头,并且在重写 URL 时不会更改。

因此,你可以在.htaccess内部重写

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

(当您确定它正常工作时,请将302(临时)重定向更改为(永久)重定向。301 会被浏览器缓存,因此可能会使测试出现问题。或者,请确保在禁用浏览器缓存的情况下进行测试。)301

?RewriteRule 代换是必需的,以便从请求中删除原始查询。(或者,您可以QSD在 Apache 2.4+ 上使用该标志)

RewriteRule 图案只是快速检查,以确保我们只处理看起来像我们想要定位的 URL。反向引用%1%2引用回条件模式

模式[\w-]+匹配包含以下内容的文章“名称”单词字符a- zA- Z0-9和。如果文章名称只有小写字母- ,_则将此模式更改为。最好对正则表达式进行更严格的限制。-az[a-z]+

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

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

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

更新#2:要添加“标题”,您只需扩展上述示例(尽管我不确定为什么需要这样做)。因此,要从 重定向到/article.php?id=12&title=some-title/article/12/some-title您可以执行以下操作:

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

相关内容