是否可以在没有 $_GET['slugs'] 的情况下拥有友好的 url?

Is it possible to have friendly urls without $_GET['slugs']?

提问人: 提问时间:6/7/2023 更新时间:6/8/2023 访问量:48

问:

我有一个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之外,是否有可能以另一种方式做到这一点?

php html mysql apache .htaccess

评论

2赞 ADyson 6/7/2023
警告:您的代码容易受到 SQL 注入攻击。应使用参数化查询和预准备语句来帮助防止攻击者使用恶意输入值破坏数据库。bobby-tables.com 给出了风险的解释,以及如何使用PHP / mysqli安全地编写查询的一些示例。切勿将非参数化数据直接插入 SQL。现在你的代码编写方式,有人可以很容易地窃取、错误地更改甚至删除你的数据。
2赞 brombeer 6/7/2023
"互联网上的每个教程都告诉你这样做“我不这么认为——你读错了教程。正如 ADyson 所提到的,这会使您的网站非常容易受到攻击。
3赞 brombeer 6/7/2023
如果文章可以具有相同的标题/slug,则可以使用URL中的ID或日期(唯一的东西)来标识文章:或/news/12/this-is-a-nice-title/news/20230607/this-is-a-nice-title
2赞 Dharman 6/7/2023
如果问题与 SQL 注入无关,那么您不应该显示 SQL 注入易受攻击的代码。请不要在网上分享不良做法。
1赞 ADyson 6/7/2023
NOTE: This is not a post about SQL injections neither vulnerabilites...也许吧,但这就是为什么在评论而不是答案中提到这个问题的原因。不过,这仍然是您需要紧急关注的事情。如果它不能代表你的真实代码,那么它也不属于这里。我们希望人们按照“如何提问”中的指导,发布一个最小的可重复示例来说明他们的问题。谢谢。

答:

0赞 ADyson 6/7/2023 #1

这听起来像是一个 X-Y 问题

如果文章可以具有相同的标题,那么您的系统需要确保它们不会使用相同的 slug 保存。

例如,如果它发现它正在尝试保存一个与现有值重复的值,那么它可以在蛞蝓的末尾附加一些随机字符、序列号、时间戳 - 任何使其唯一的东西。

你怎么做可能并不重要,关键是要有一个确保不会有重复的过程。通常,从源头上阻止问题比试图找到解决方法更容易。

最终,如果有两个相同的 slug,系统在解析 URL 时将永远无法区分它们,因此您一开始就不能允许这种情况发生。

不存在按 ID 查询的问题,因为您在需要 ID 时没有 ID。您所拥有的只是 URL 中的 slug 值。这就是显示用户要求显示的帖子的内容,并且 URL 不包含有关该帖子的任何其他信息。因此,这是您需要查询的东西,因此要使其正常工作,您的系统必须确保每个 slug 在您的数据库中都是唯一的。

评论

0赞 6/7/2023
所以除了查询蛞蝓之外没有其他方法?
0赞 ADyson 6/7/2023
我认为您必须查询蛞蝓,因为这是您从 URL 获得的唯一信息,以显示应该显示哪个帖子。这是将 URL 链接到帖子的数据。因此,您必须使用它进行查询,这反过来又意味着它必须是唯一的。
0赞 Kamikaza 6/8/2023 #2

是的,可以通过非常简单的方式实现:

当您使用蛞蝓链接访问者时,您只需将 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]