【问题标题】:How do I pass id but don't display it in URL如何传递 id 但不在 URL 中显示
【发布时间】:2019-05-26 19:52:36
【问题描述】:

我在 act 参数中传递了帖子的标题,如下所示:

$act = explode(' ', strtolower($post['title']));
$act = implode('-', $act);

我在 .htaccess 中包含以下代码:

RewriteRule ^([a-zA-Z]+)$ $1.php
RewriteRule ^([0-9]+)/([a-z-]+) test.php?id=$1&act=$2

我当前的友好 URL 如下所示:http://demo.web/1/hello-world 但是,我希望它看起来像这样:http://demo.web/hello-world 但我也想传递 id 因为我从 ID 本身获取数据。将来直接按帖子标题编写查询可能不适合,因为一个帖子标题可能与另一个帖子标题匹配。如何传递 ID 但不显示在 URL 中?

【问题讨论】:

  • 如果您想将旧 URI 中的 id 参数传递给新 URI,那么它必须存在于旧 URI 中。

标签: .htaccess url-rewriting friendly-url


【解决方案1】:

我能想到的两种可能的解决方案...

第一个是在保存页面时根据标题创建一个唯一的 URL。

如果您保存一个标题为“Hello World”的页面,那么 URL 路径可能是...

/你好世界

此路径与页面内容字段的其余部分一起保存。

如果稍后创建另一个具有相同标题的页面,则其 URL 可能变为 ...

/hello-world-2

...等等。

第二个选项是在 URL 路径中包含 ID,但不是 RAW 整数形式。您可以使用某种散列或加密,这样您就不会直接暴露数据库 ID。

一个非常简单的实现可能是向 ID 添加一些常量,然后对其进行十六进制编码。

稍微复杂一点的方法可能是对 ID 进行十六进制编码,并将其与 ID 的哈希值 + 一些密钥结合起来。

从给定的 URL 路径中找出数字 ID 仍然相当简单,但黑客很难仅根据 ID 创建有效的页面 URL。

例如,如果我想从网站中提取所有页面内容。如果网站在 URL 中使用原始 ID,我可以简单地遍历一些猜测的 ID 号范围,生成每个 URL,然后下载页面。

但是,如果 URL 包含 ID + 密钥的哈希,我无法生成有效的 URL,也不知道用于哈希的密钥。

【讨论】:

  • 我不关心显示原始 ID,我只是希望 URL 看起来漂亮。如果可能的话,我想从 .htaccess 做。
  • @AlishaLamichhane 我已经更新了我的答案以包含另一个选项。您可以允许重复的标题,但使 URL 唯一。
  • @AlishaLamichhane 需要考虑的一件事是,如果将 URL 保存为页面的属性,那么当标题更改时该怎么办。如果您自动更改 URL,那么您可能需要跟踪旧 URL 以确保它们被 301 重定向。
  • 那么如何加密ID呢?
猜你喜欢
  • 2013-03-11
  • 1970-01-01
  • 2023-04-07
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-11
  • 2011-04-26
相关资源
最近更新 更多