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. 我原以为Ruby的 >它不提供任何解析查询字符串部分的机制. (这不是很难做到的,也不是标准的.) 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" (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |