一 URI编码
说明: man ascii '观察'
② 为什么要进行URI编码
RFC3986规定:uri中只允许包含'a-zA-Z'、'0-9'、'-_.~'4个特殊字符'以及所有'保留'字符
备注: '~ 波浪线'虽然'不要求'编码,但一些'老网关或代理'会编码
③ 保留字符与非保留字符
! * ’ ( ) ; : @ & = + $ , / ? # [ ]
备注: 这些是'保留'字符,'路径'分隔,'参数'分隔等作用
④ URI百分号%编码方式
思考: 如何进行'URL'编码?
1) 16进制表示形式,一个字节一个字节的表示,前面用'%百分号'
2) 不要求编码的字符'可以不'编码,编码了也'不'影响,,比如'a <=> %61'
备注: 一般是'非法'字符才进行'URI'编码
3) 中文按字节表示,比如 "中" 三个字节'0xE4 0xB8 0xAD', 就是 '%E4%B8%AD'
重要: 某些库对uri的编码'不尽相同',这些库在'不同的安全环境'中对'不同字符'处理策略不同
+++++++++++++++ "perl的" +++++++++++++++
cpan URI::Escape
perl -MURI::Escape -le 'print uri_escape("http://example.com")'
思考: 'URI'编码和'URI'转义是一个'含义'吗?
+++++++++++++++ "python的" +++++++++++++++
# coding=utf-8
import urllib
from urllib import parse
txt = 'http://example.com'
#URL编码
new_txt = urllib.parse.quote(txt)
print(new_txt)
⑥ 理解nginx中归一化
curl --data-urlencode URI编码 encoding (normalizing) part of URI $request_uri vs $uri
nginx日志打印请求参数中文件流乱码问题 nginx日志中文显示为16进制问题解决
nginx没有正确开启支持SSL的情况下,access日志会出现$request字段是十六进制字符串
思考: 'proxy_pass'中透传的'uri'是什么格式?
proxy_pass uri编码和解码问题 proxy_pass 避免url decode的三种方法
如何避免proxy_pass中nginx将url decode nginx1.9.2 uri编码
++++++++++++ "proxy_paas必须带attach_url 不解码的最佳实践" ++++++++++++
location ~ ^/gate {
if ($request_uri ~* ^/gate/(.*)$) {
proxy_pass http://127.0.0.1:8081/$1;
}
}