草庐IT

php - User agent header - mysql存储的缩写

coder 2023-10-19 原文

根据这个线程,特别是这个帖子:https://stackoverflow.com/a/6595973/1125465 ,微软一如既往地炫耀。用户代理的大小可能非常非常大。

我正在用 php 开发一个小型访客库,我想存储用户代理信息。我无法决定数据类型和长度。

所以我的问题是:关于如何将用户代理缩短到某个“正常”大小,您有什么想法吗? (例如 256 个字符)


注意:开发人员使用用户代理来检测用户浏览器和操作系统。所以根据链接的例子,所有来自 M$ 的愚蠢数字都只是......只是。一如既往,让我们心烦意乱。 因此,我们的想法是制作一个缩短用户代理字符串但又不会丢失重要信息的函数。

我认为这样的功能应该:

  • 不依赖于 future 的更新和新浏览器(无硬编码字符串)
  • 有一个简单的机制来决定删除什么(例如,如果有一个数字,逗号,数字,逗号,数字,逗号,数字,......,它可以删除它,这并不有趣)。
  • 最后,如果所有操作仍然导致用户代理太长(比如 256 个字符),那么就没有什么可做的了,所以只需切断其余部分即可。这是百万分之一,因此数据可能会丢失。

附加说明:我知道,我可以创建一个函数,从用户代理获取浏览器和操作系统类型,并仅保存这些值。但是像往常一样,这样的函数有硬编码的名称,如果无法识别浏览器,它会返回“无法识别的浏览器”。所以将来每个人都必须记住更新这些函数。如果我们保存缩短用户代理,信息是丢失(因为只有读取数据库的脚本必须有新的识别系统)。但数据库中的条目是可靠和一致的,应该是。


更新: 因为应该有一些代码,而且想法有问题,而不是现有代码的问题,所以我会写一些我到目前为止写的最少的代码;):

<?php
    function shorten($useragent, $maxsize = 256) {
        $shorten = $useragent;
        ... // ?
        $shorten = substr($shorten, 0, $maxsize); // the "last hope" cut
        return $shorten;
    }
    echo shorten($_SERVER['HTTP_USER_AGENT']);
?>

最佳答案

User-Agent 字符串没有规则,因此无法创建完全正确且面向 future 的解析器。不过有一个通用模式:

User-Agent: <engine-string> <engine-string> ...

engine-string 的形式:

<agent-name> (<comment>; <comment>; ...)

每个引擎字符串(我只是根据我的理解调用它,这可能不正确)可能有也可能没有评论。

例如:

Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) ↲
AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e ↲
Safari/8536.25 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)

(这是一个单一的字符串,我只是把它分成几行。)似乎,每当有人对浏览器引擎进行 fork 时,他们只是将他们的东西附加到最后。所以我们有一些抽象的“Mozilla”浏览器(“第一次浏览器大战”的遗产)认为它在 iPhone 上。然后我们看到有一个 WebKit(它记得很久以前它是作为 KHTML 诞生的)。然后是Version/6.0的一些修改,然后修改成Mobile/10A5376e,变成Safari/8536.25,终于揭开了它其实是一个移动谷歌bot的 secret 。

另一个例子:

Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB7.4; ↲
InfoPath.1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.4506.2152; ↲
.NET CLR 3.5.30729; .NET CLR 1.1.4322)

这是一个单一的引擎,但它在括号中有很多话要说。

所以一般的观察是:

  • 最后的引擎字符串最重要,
  • 括号中的最后评论不太重要。

考虑到这一点,我的想法是将字符串解析为这些引擎和评论标记,然后从每个引擎部分丢弃评论,比如从第五个开始。然后,如果仍然不够,从第二个开始扔掉引擎部分(第一个通常是抽象的“Mozilla”,但通常有有用的评论;有时它实际上是具体的东西,特别是对于网络爬虫)。

在解析时,我们需要考虑到偶尔可能会有不遵循这种格式的字符串。它们可以保存到日志文件中供以后检查,然后简单地剪切成所需的长度以适合数据库。

关于php - User agent header - mysql存储的缩写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23742935/

有关php - User agent header - mysql存储的缩写的更多相关文章

  1. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  2. ruby - Rack:如何将 URL 存储为变量? - 2

    我正在编写一个简单的静态Rack应用程序。查看下面的config.ru代码:useRack::Static,:urls=>["/elements","/img","/pages","/users","/css","/js"],:root=>"archive"map'/'dorunProc.new{|env|[200,{'Content-Type'=>'text/html','Cache-Control'=>'public,max-age=6400'},File.open('archive/splash.html',File::RDONLY)]}endmap'/pages/search.

  3. 使用canal同步MySQL数据到ES - 2

    文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

  4. ruby-on-rails - 为什么在 Rails 5.1.1 中删除了 session 存储初始化程序 - 2

    我去了这个website查看Rails5.0.0和Rails5.1.1之间的区别为什么5.1.1不再包含:config/initializers/session_store.rb?谢谢 最佳答案 这是删除它的提交:Setupdefaultsessionstoreinternally,nolongerthroughanapplicationinitializer总而言之,新应用没有该初始化器,session存储默认设置为cookie存储。即与在该初始值设定项的生成版本中指定的值相同。 关于

  5. ruby-on-rails - 无法安装 mysql2 0.3.14 gem - 2

    我看到其他人也遇到过类似的问题,但没有一个解决方案对我有用。0.3.14gem与其他gem文件一起存在。我已经完全按照此处指示完成了所有操作:https://github.com/brianmario/mysql2.我仍然得到以下信息。我不知道为什么安装程序指示它找不到include目录,因为我已经检查过它存在。thread.h文件存在,但不在ruby​​目录中。相反,它在这里:C:\RailsInstaller\DevKit\lib\perl5\5.8\msys\CORE\我正在运行Windows7并尝试在Aptana3中构建我的Rails项目。我的Ruby是1.9.3。$gemin

  6. ruby-on-rails - 尝试设置 Amazon 的 S3 存储桶 : 403 Forbidden error & setting permissions - 2

    我正在关注Hartl的railstutorial.org并已到达11.4.4:Imageuploadinproduction.我做了什么:注册亚马逊网络服务在AmazonIdentityandAccessManagement中,我创建了一个用户。用户创建成功。在AmazonS3中,我创建了一个新存储桶。设置新存储桶的权限:权限:本教程指示“授予上一步创建的用户读写权限”。但是,在存储桶的“权限”下,未提及新用户名。我只能在每个人、经过身份验证的用户、日志传送、我和亚马逊似乎根据我的名字+数字创建的用户名之间进行选择。我已经通过选择经过身份验证的用户并选中了上传/删除和查看权限的框(而不

  7. ruby-on-rails - 我如何告诉 Rails 如何正确地大写首字母缩写词? - 2

    我的一个模型中有一个名为sui的字段。它代表“标准用户标识符”。当该字段出现验证错误时,Rails会打印“Suiisrequired”或“Suiisalreadytaken”。如何告诉Rails'sui'.titleize是“SUI”?我查看了Inflector.human,但这并不完全正确。 最佳答案 在这种情况下,我使用custom_err_msg插入。安装后,您可以提供如下自定义错误消息:validates_presence_of:sui,:message=>'^SUIisrequired'当您将^放在开头时,Rails不会输

  8. ruby - 如何打印出 Mechanized 存储的 cookie? - 2

    我正在使用mechanize登录网站,然后检索页面。我遇到了一些问题,我怀疑这是由于cookie中的某些值造成的。当Mechanize登录网站时,我假设它存储了cookie。如何通过Mechanize打印出存储在cookie中的所有数据? 最佳答案 代理有一个cookie方法。agent=Mechanize.newpage=agent.get("http://www.google.com/")agent.cookiesagent.cookies.to_scookie返回一个Mechanize::Cookiesobject

  9. ruby-on-rails - 闪存消息存储在哪里? - 2

    我以为它们存储在cookie中-但不,检查cookie没有任何结果。session也不存储它们。那么,我在哪里可以找到它们?我需要这个来直接设置它们(而不是通过flashhash)。 最佳答案 它们存储在inyoursessionstore.自rails2.0以来的默认设置是cookie存储,但请检查config/initializers/session_store.rb以检查您是否使用默认设置以外的东西。 关于ruby-on-rails-闪存消息存储在哪里?,我们在StackOverf

  10. ruby - 如何使用 ruby​​ mysql2 执行事务 - 2

    我已经开始使用mysql2gem。我试图弄清楚一些基本的事情——其中之一是如何明确地执行事务(对于批处理操作,比如多个INSERT/UPDATE查询)。在旧的ruby-mysql中,这是我的方法:client=Mysql.real_connect(...)inserts=["INSERTINTO...","UPDATE..WHEREid=..",#etc]client.autocommit(false)inserts.eachdo|ins|beginclient.query(ins)rescue#handleerrorsorabortentirelyendendclient.commi

随机推荐