我应该如何处理非常非常长的 URL?

2024-03-21

我想知道这是否是一个错误,但现在我对所有搜索 URL 都使用 GET。原因是,通过 GET Url,用户可以简单地复制地址栏上的链接并轻松共享或保存。例如,Google 似乎也使用 GET Url(表单)。

由于它是一个带有过滤器、排序器等的搜索表单,因此生成的 URL 的长度可能是不可预测的。我担心 URL 可能超出长度限制的边缘情况。可能的解决方案是实际 POST 数据,然后根据该数据生成唯一的哈希值,然后使用它作为搜索的 URL。例如,该解决方案确实需要将实际的表单数据保存到数据库,然后在每个搜索请求上重新查询它,这似乎很浪费。

我想知道还有什么我还没想到的办法吗?

编辑:我想感谢您在这里的所有回答,他们帮助了很多。我将在下面总结我为解决此问题所做的工作,希望对其他人有所帮助:

  1. 正如所指出的,如果 URL 太长(超过 2000 个字符),那么我可能做错了什么。所以我回去重新审视了我的算法,并设法将我必须通过 GET 字符串传递的信息削减了一半以上(以前,它可以轻松获取超过 500 个字符,这让我很担心)
  2. 我还对我的字符串进行了 json 化。原因是深层嵌套数组在查询字符串上效果不佳,通过 json化数组,我实际上得到了一个更短且更易于阅读的结果
  3. 还有另一种解决方案,那就是编写自己的解析器,例如,如果您想获得更短的网址,您可以编写:category=1,2,3,4,5,因为您已经知道您的查询结构,所以您可以这样做在你的后端进行解析。这需要更多的工作,所以我还没有尝试过,直到我真的需要这样做
  4. 我还没有尝试过哈希/令牌路线,但我相信如果您真的必须处理大量输入,这也是一个很好的解决方案。您可以 POST 输入,然后发回哈希字符串标记以用作搜索 URL。

First of all, according to this Stack Overflow answer https://stackoverflow.com/a/417184/1709587, you're fine up until 2000 characters1.

一旦达到该限制,如果您想保持 URL 的可共享性,我可以看到以下几种选择:

  1. 正如您所建议的,使用 POST 请求来存储实际查询并将其与哈希关联,然后使用后续 GET 请求来运行查询并检索结果。
  2. 压缩客户端的查询字符串并在服务器端解压缩。

让我们考虑一下这些方法的相对优点。

支持哈希...

  • 您可以将 URL 保持任意小(并且具有固定长度,例如 12 或 16 个字符),而如果您采用压缩路线,则可能会得到更长(因此更难看)的 URL。
  • 您的搜索可以变得任意长——如果您出于某种不正当的原因需要它们,它们可能是巨大的数千页文档。 (你可能不知道。)
  • 您可以在 PHP 中轻松地执行此操作hash http://php.net/manual/en/function.hash.php,而使用什么工具进行压缩方法则不太明显。

有利于压缩...

  • 表现。每当用户进行搜索时,散列方法都需要向服务器发出两个请求,这不可避免地会对用户可见的性能产生影响,因为每次搜索都要付出与服务器额外往返的延迟成本。 (好吧,如果您对客户端进行散列,并在知道计算出的散列是否已存储之前尝试使用计算出的散列进行 GET,那么您可以将其减少到 1 个对某人之前执行过的搜索的请求,但这样做的代价是新的搜索需要3要求。)
  • 您不需要在任何地方存储哈希到查询的映射。根据您的具体情况,当表有数亿行时,将这些数据放入数据库可能会在数年后成为性能陷阱或磁盘使用问题。

其中一些因素可能与您无关,具体取决于您的具体情况;我让你权衡你的优先事项。

如果你想走压缩路线,我不知道该向你推荐什么工具。如何压缩URL参数 https://stackoverflow.com/questions/21802866/how-to-compress-url-parameters可能是一个开始寻找的好地方。或许还可以考虑https://github.com/pieroxy/lz-string https://github.com/pieroxy/lz-string压缩https://github.com/nullpunkt/lz-string-php https://github.com/nullpunkt/lz-string-php解压。


1 Note that a 2000 character URL is quite long. Are your URLs really this long?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我应该如何处理非常非常长的 URL? 的相关文章

  • CodeIgniter:使用多维 POST 数据验证表单

    所以框架是CodeIgniter 2 0 2 我有一个表单 其中包含与数据库中的行相对应的字段组 字段名称的格式为 opt 0 foo opt 0 bar opt 1 foo opt 1 bar etc 索引 1 2等 并不对应于数据库中的
  • SQL查询:按字符长度排序?

    是否可以按字符总数对sql数据行进行排序 e g SELECT FROM database ORDER BY data length 我想你想用这个 http dev mysql com doc refman 5 0 en string f
  • 使用 php 变量更改 css 类

    这里需要您的帮助 正如标题所示 我正在尝试使用 PHP 变量更改 css 类 所以基本上我想创建一个回显某些代码的循环 但我希望第一个循环中的 div 类有所不同 它应该被隐藏 这是我为使问题变得清晰而编写的简化代码 我不知道错误在哪里 请
  • laravel Blade 模板不渲染

    进入 Laravel 后 我尝试使用 Blade 模板 但它没有渲染 我的所有示例都来自 Laravel 文档 UPDATE 所以这是我的master blade php 文件位于资源 gt 视图 gt master blade php y
  • 调用未定义的函数 MYSQL_NUM_ROWS() [重复]

    这个问题在这里已经有答案了 我正在尝试使用 php 验证登录 但收到此错误 致命错误 未捕获错误 调用 opt lampp htdocs social index php 100 中未定义的函数 MYSQL NUM ROWS 堆栈跟踪 0
  • 如何使用 PHP 调整缩略图大小时提高图像质量?

    我在网上找到了这个脚本 它可以从图像中创建缩略图 但创建的缩略图质量很差 如何提高图像的质量 有没有更好的方法来创建缩略图 如果有的话 您能给我指点一下如何使用 PHP 创建缩略图的教程吗 这是下面的代码
  • 回显 HTML 并内置 PHP

    请帮助我使用 echo 与 HTML 和 PHP 使用数组范围将其转换为动态
  • 在 PHP $_SESSION 中存储数据不安全吗?

    根据我的理解 PHP 进程的行为并不像应用程序服务器进程 因此 执行脚本后 PHP 进程不会保留任何用户特定数据 相反 它将它们存储在用户的 cookie 中 所以无论我们存储在什么地方 SESSSION进入cookie 这是真的 如果是
  • 数组到字符串转换注意事项。为什么?

    为什么我得到 Applications MAMP htdocs test2 php 第 11 行中的数组到字符串转换 注意 users array aa a b bb cc c foreach users as usr var htmlsp
  • 使用 htmlpurifier 将具有 of 类的元素列入白名单

    我只想仅当 span 元素在 htmlpurifier 中具有特定类时才允许它 有谁知道该怎么做 现在我有 config gt set HTML Allowed a href p ol li ul img src blockquote em
  • Codeigniter - 检查用户是否已登录并存在(它是真实用户)

    我正在尝试在用户登录我的网站时为他们设置会话数据 因此 如果用户存在于数据库中 我将设置一个会话数据 例如 this gt session gt set userdata user exists 1 现在 每次我想检查用户是否存在并已登录时
  • 使用 laravel 检查活动用户状态

    这是非常标准的登录功能和验证 效果很好 但我还想检查用户是否处于活动状态 我在用户表中设置了一列 并将 活动 设置为 0 或 1 public function post login input Input all rules array
  • \r 和 \n 在 PHP(和其他语言)中意味着什么?

    这些叫什么 r n 有解释它们的教程吗 它们分别是 回车 和 换行 通常在 Windows 上 您需要将两者一起表示行终止符 r n 而在大多数 全部 Unix 系统上 n 就足够了 See the 维基百科换行条目 http en wik
  • 使用composer create-project安装特定的laravel 5版本

    今天我尝试安装特定的 laravel 版本composer create project laravel laravel 5 1 8 your project name prefer dist 因为有些插件在5 1 9及以上版本有问题 但是
  • Doctrine 生成实体命名空间问题?

    好吧 我对原则有最后一个问题 生成 实体命令 我运行以下命令 并得到预期的文件 src MyNamespace Bundle MyNamespaceBundle Resources config doctrine metadata orm
  • PHP使用正则表达式查找字符串

    我已经阅读了多个有关正则表达式的教程 但它只是不会留在我的脑海中 我永远无法让我的模式发挥作用 希望有人能帮忙 我有一个 php 变量 content 我需要在其中找到如下所示的特定模式 图库 名称 文件夹 我想搜索 starting wi
  • 在php中将数组写入文件并获取数据

    我有一个数组 使用后如下所示print r Array 0 gt Array 0 gt piklu name gt piklu 1 gt Array 0 gt arindam name gt arindam 2 gt Array 0 gt
  • 向 tk103 GPS 跟踪器发送命令

    我正在使用 php 开发实时 GPS 跟踪器 Web 应用程序 跟踪器参考号是tk103 我可以从跟踪器接收信息并将其存储到数据库中 设备的 GPRS 模式已启用 我的问题是 如何使用 php ini 将命令从服务器发送到设备 提前致谢 这
  • 在 PHP 中设置通知的 FCM 通道 ID

    我正在尝试使用 PHP 向 Android 设备发送 FCM 通知 我的代码适用于 Android O 之前的设备 在Android O中 我们还需要在请求中设置通道ID来接收通知 我不知道该怎么做 我已在应用程序中完成了必要的设置 并使用
  • 在订单项目视图中显示自定义产品数据

    我在添加到购物车时遇到问题 我有一个具有不同定制条件的产品可供选择 当客户选择特定选项时 它添加到购物车 当客户选择另一种选择并添加时 它显示为购物车中的第二件商品 这没关系 但付款后 订单在第 1 项和第 2 项下均显示自定义选项 但没有

随机推荐

  • AccountAuthenticatorActivity 和片段

    当我使用支持包时 有没有办法将片段与 AccountAuthenticatorActivity 一起使用 AccountAuthenitactorActivity 不会子类 FragmentActivity 类 因此我不确定在使用支持包时如
  • 您可以从 Mobile Safari 访问 iPhone 相机吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有 JavaScript API 用于从 Mobile Safari 访问 iPhone 的相机
  • 无法使用 Javascript 更改

    在 Chromium 7 0 517 44 64615 Ubuntu 10 10 上 我似乎无法更改type的属性
  • CMake 抛出错误:无法加载缓存

    我正在尝试建立滴滴19 0 http dlib net release notes html例子 我做到了 cd examples mkdir build cd build cmake cmake build 现在获取exe cmake b
  • 如何使用 java 更改 Nimbus 外观和感觉的背景颜色

    在 Java Swing 应用程序中 我正在尝试 nimbus 的外观和感觉 它在 JdesktopPane 控件中看起来非常好 但我希望我的所有桌面窗格具有不同的颜色 但主题很好 有什么方法可以改变 Nimbus 外观和感觉的背景颜色吗
  • PHP中如何分割汉字?

    我需要一些关于如何在 PHP 中拆分与英文单词和数字混合的汉字的帮助 例如 如果我读到 FrontPage 2000中文版應用大全 我希望得到 FrontPage 2000 中 文 版 應 用 大 全 or FrontPage 2 0 0
  • Android Studio 中 gitIgnore 文件放在哪里?

    我正在开发一个应用程序 我必须将该项目带到 GitHub 现在 我必须制作 gitIgnore 文件 我知道该文件用于忽略我的项目中的某些指定文件 我使用了 gitIgnore io 服务并收到了生成的文件 这是我的 gitIgnore 文
  • 宅基地安装

    我不知道我在哪里犯了错误 我的命令vagrant up回复以下几行 vagrant up Check your Homestead yaml file the path to your private key does not exist
  • Rails 和 Mutli Nesting 中的祖先宝石

    我正在使用 Rails 中的祖先 gem 来嵌套一些注释 我想要的是让您能够获取所有注释 然后将它们全部嵌套 当我输入时 我如何得到以下信息 comments post comments arrange serializable进入我的评论
  • 仅在Gitlab CI中测试失败,本地成功

    我刚刚开始使用 Gitlab CI 使用 docker 执行器 在面对并解决了一些初学者的问题之后 我现在面临着一个非常奇怪的问题 我所有的单元测试都在本地成功 但是当我使用 CI 运行它们时 其中一些测试失败了 一个例子 2018 12
  • 如何等待鼠标点击

    class GameFrameClass extends javax swing JFrame public void MyFunc UserButton setText Str UserButton addActionListener n
  • 无法访问通过 Visual Studio 创建的数据库?

    我已经创建了一个数据库电子邮件数据库 它存储在 C Program Files Microsoft SQL Server MSSQL10 MSSQLSERVER MSSQL DATA 在 Visual Studio 中 我使用Server
  • 实现多个接口是否违反单一职责原则?

    From 维基百科 http en wikipedia org wiki Single responsibility principle 单一责任原则规定每个类都应该有一个 单一责任 并且该责任应该完全由 由类封装 这是否意味着实现多个接口
  • Mongoid has_and_belongs_to_many 关联

    我试图让 mongoid 来保存关联 但我只能让一侧工作 如果我有以下测试 test should add a user as a follower when a user follows the group do cali group f
  • 没有“isPresent()”检查的“Optional.get()”

    我有以下 Java 搜索代码 return getTableViewController getMe getColumns stream filter gt Database equalsColumnName getId columnId
  • ActionController::Live 是否可以检查连接是否仍然有效?

    我正在尝试使用 Rails 4 的实时流媒体来实现文本 事件流 它工作得很好 我遇到的唯一麻烦是我无法在不发送任何消息的情况下检查连接是否有效 我想到的唯一解决方案是使用循环刻度生成器创建支持通道 以便某些后台任务会定期向那里发送消息 但看
  • 调用构造函数重新初始化对象

    是否可以使用类的构造函数重新初始化类的对象 有点 给定 A 类 A a a A 最后一条语句不是初始化 而是赋值 但它可能会执行您想要的操作
  • 如何在jboss中生成resteasy的wadl文件

    我想为我的项目生成一个 wadl 文件 该文件使用resteasy Jboss 6 4 Maven 有很多关于球衣的例子 但不是关于resteasy的 有人用它来resteasy吗 Resteasy 从 3 0 14 Final 开始支持
  • 对 Cassandra 术语感到困惑(行与分区)

    我希望有人能够消除我对 Cassandra 中的行和分区之间的区别的困惑 我认为一行将是一组列 就像在 SQL 数据库中 如架构中指定的那样 按分区键跨节点分布 并按每个分区内的集群键排序 但后来我遇到了这个教程 https academy
  • 我应该如何处理非常非常长的 URL?

    我想知道这是否是一个错误 但现在我对所有搜索 URL 都使用 GET 原因是 通过 GET Url 用户可以简单地复制地址栏上的链接并轻松共享或保存 例如 Google 似乎也使用 GET Url 表单 由于它是一个带有过滤器 排序器等的搜