我从Akamai的日志文件中获取URI,其中包含以下条目:
/foo/jim/jam
/foo/jim/jam?
/foo/./jim/jam
/foo/bar/../jim/jam
/foo/jim/jam?autho=<randomstring>&file=jam
Run Code Online (Sandbox Code Playgroud)
我想根据规则将所有这些规范化为相同的条目:
autho和file从它.?../应删除目录条目.<fulldir>/../应删除目录条目.我原以为URIRuby 的库会覆盖这个,但是:
?如果查询字符串已清空,则不会删除尾随.
URI.parse('/foo?jim').tap{ |u| u.query='' }.to_s #=> "/foo?"
Run Code Online (Sandbox Code Playgroud)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
Run Code Online (Sandbox Code Playgroud)
它恰好适用于我上面列出的测试用例,但有450,000个清理路径我无法全部检查它们.
该寻址创业板将这些归为你:
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"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1376 次 |
| 最近记录: |