加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – 规范化HTTP URI

发布时间:2020-12-17 01:35:00 所属栏目:百科 来源:网络整理
导读:我从Akamai的日志文件中获取URI,其中包含以下条目: /foo/jim/jam/foo/jim/jam?/foo/./jim/jam/foo/bar/../jim/jam/foo/jim/jam?autho=randomstringfile=jam 我想根据规则将所有这些规范化为相同的条目: 如果有查询字符串,请从中删除autho和file. 如果查询
我从Akamai的日志文件中获取URI,其中包含以下条目:

/foo/jim/jam
/foo/jim/jam?
/foo/./jim/jam
/foo/bar/../jim/jam
/foo/jim/jam?autho=<randomstring>&file=jam

我想根据规则将所有这些规范化为相同的条目:

>如果有查询字符串,请从中删除autho和file.
>如果查询字符串为空,请删除尾随?.
>应删除./的目录条目.
>应删除< fulldir> /../的目录条目.

我原以为Ruby的URI库会覆盖这个,但是:

>它不提供任何解析查询字符串部分的机制. (这不是很难做到的,也不是标准的.)
>它不会删除尾随?如果查询字符串被清空.

URI.parse('/foo?jim').tap{ |u| u.query='' }.to_s #=> "/foo?"

> normalize方法不会清理.或..在路径中.

因此,如果没有官方图书馆,我发现自己编写了一个基于正则表达式的解决方案.

def normalize(path)
  result = path.dup
  path.sub! /(?<=?).+$/ do |query|
    query.split('&').reject do |kv|
      %w[ autho file ].include?(kv[/^[^=]+/])
    end.join('&')
  end
  path.sub! /?$/,''
  path.sub!(/^[^?]+/){ |path| path.gsub(%r{[^/]+/..},'').gsub('/./','/') }
end

它恰好适用于我上面列出的测试用例,但有450,000个清理路径我无法全部检查它们.

>考虑到可能的日志文件条目,上面是否有任何明显的错误?
>有没有更好的方法来实现相同的解析技术,而不是我的手卷正则表达式?

解决方法

addressable gem将为您规范化这些:

require 'addressable/uri'

# normalize relative paths
uri = Addressable::URI.parse('http://example.com/foo/bar/../jim/jam')
puts uri.normalize.to_s #=> "http://example.com/foo/jim/jam"

# removes trailing ?
uri = Addressable::URI.parse('http://example.com/foo/jim/jam?')
puts uri.normalize.to_s #=> "http://example.com/foo/jim/jam"

# leaves empty parameters alone
uri = Addressable::URI.parse('http://example.com/foo/jim/jam?jim')
puts uri.normalize.to_s #=> "http://example.com/foo/jim/jam?jim"

# remove specific query parameters
uri = Addressable::URI.parse('http://example.com/foo/jim/jam?autho=<randomstring>&file=jam')
cleaned_query = uri.query_values
cleaned_query.delete('autho')
cleaned_query.delete('file')
uri.query_values = cleaned_query
uri.normalize.to_s #=> "http://example.com/foo/jim/jam"

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读