![如何将用户从未重写的 URL 重写为重写的 URL](https://linux22.com/image/696038/%E5%A6%82%E4%BD%95%E5%B0%86%E7%94%A8%E6%88%B7%E4%BB%8E%E6%9C%AA%E9%87%8D%E5%86%99%E7%9A%84%20URL%20%E9%87%8D%E5%86%99%E4%B8%BA%E9%87%8D%E5%86%99%E7%9A%84%20URL.png)
我有两个 URL。其中一个看起来像这样(非重写 URL):
www.example.com/article.php?id=12
下一个看起来像这样(重写的 URL):
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
- z
、A
- Z
、0
-9
和。如果文章名称只有小写字母- ,_
则将此模式更改为。最好对正则表达式进行更严格的限制。-
a
z
[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]