提问人: 提问时间:6/7/2023 更新时间:6/8/2023 访问量:48
是否可以在没有 $_GET['slugs'] 的情况下拥有友好的 url?
Is it possible to have friendly urls without $_GET['slugs']?
问:
我有一个PHP脚本,可以使用以下参数将新文章保存到MySQL中:
ID, Date, Category, Title, Content, Slug
其中 Slug 是相同的标题,但带有 - 破折号,如下所示:
this-is-a-nice-title
然后我有文章.php,其中显示所有文章并链接到read-article.php,其中所选文章可以在这样的seo友好URL中阅读
domain.com/news/this-is-a-nice-title
就像其他人一样,页面read-article.php向MySQL发送查询,如下所示:
SELECT * FROM articles WHERE slug=?
在一切正常之前,互联网上的每个教程都会告诉您这样做,并且它有效。
但问题来了:如果某些文章出于任何原因、任何错误或失误而具有相同的标题,那将是一个问题。因此,最好使用 ID 进行查询,而不是像这样:
SELECT * FROM articles WHERE id=?
问题是我无法使其工作,我总是收到错误 404,因为当没有结果时,我在测试/开发时将其设置为 error-404.php
没有教程教您如何在不按 slug 名称查询 MySQL 的情况下创建友好的 url。因此,我的问题是:除了查询MySQL中的slug之外,是否有可能以另一种方式做到这一点?
答:
这听起来像是一个 X-Y 问题。
如果文章可以具有相同的标题,那么您的系统需要确保它们不会使用相同的 slug 保存。
例如,如果它发现它正在尝试保存一个与现有值重复的值,那么它可以在蛞蝓的末尾附加一些随机字符、序列号、时间戳 - 任何使其唯一的东西。
你怎么做可能并不重要,关键是要有一个确保不会有重复的过程。通常,从源头上阻止问题比试图找到解决方法更容易。
最终,如果有两个相同的 slug,系统在解析 URL 时将永远无法区分它们,因此您一开始就不能允许这种情况发生。
不存在按 ID 查询的问题,因为您在需要 ID 时没有 ID。您所拥有的只是 URL 中的 slug 值。这就是显示用户要求显示的帖子的内容,并且 URL 不包含有关该帖子的任何其他信息。因此,这是您需要查询的东西,因此要使其正常工作,您的系统必须确保每个 slug 在您的数据库中都是唯一的。
评论
是的,可以通过非常简单的方式实现:
当您使用蛞蝓链接访问者时,您只需将 ID 添加到其中,例如:
<a href="<?php echo $row['slug'];?>&id=<?php echo $row['id'];?>">
<?php echo $row['title'];?>
</a>
然后在 slug 页面中,您只需查询按 ID 而不是 slug 进行选择 不要忘记像这样编辑你的htaccess文件:
RewriteRule ^([-/.a-zA-Z0-9]+)$ slug.php?slug=$1&id=$2 [QSA,END]
评论
/news/12/this-is-a-nice-title
/news/20230607/this-is-a-nice-title
NOTE: This is not a post about SQL injections neither vulnerabilites
...也许吧,但这就是为什么在评论而不是答案中提到这个问题的原因。不过,这仍然是您需要紧急关注的事情。如果它不能代表你的真实代码,那么它也不属于这里。我们希望人们按照“如何提问”中的指导,发布一个最小的可重复示例来说明他们的问题。谢谢。