首页 > 代码库 > Nginx将utf8编码的url解码成\x的16进制格式导致无法匹配静态文件的问题处理
Nginx将utf8编码的url解码成\x的16进制格式导致无法匹配静态文件的问题处理
例如请求/touch/article/北京/full.html,到达nginx后变成/ /touch/article/%E5%8C%97%E4%BA%AC/full.html,
Nginx静态文件配置:
location ~* ^/touch/article/.*\.html$ {
expires -1;
root /home/htmlfile;
charset UTF-8;
if ( !-f $request_filename ){
proxy_pass http://client.api.com;
}
}
实际请求的地址为/home/htmlfile/touch/article/\xE5\x8C\x97\xE4\xBA\xAC/full.html,将url进行了解码处理,但是这种16进制格式无法匹配静态目录,解决方法:
location ~* ^/touch/article/.*\.html$ {
charset utf-8;
alias /home/htmlfile$request_uri;
# charset utf-8;
if ( !-f $request_filename ){
proxy_pass http://client.api.com;
}
}
通过alias命令和$request_uri变量,指向正确的静态文件。
注:1)$request_uri #包含请求参数的原始URI
$uri #不带请求参数的当前URI,即转换后的地址
$request_filename #当前请求的文件路径,由root或alias指令与URI请求生成,即root
经过一系列优化等处理后实际指向的本地文件路径
2)root与alias区别:
nginx指定文件路径有两种方式root和alias,root与alias主要区别在于nginx如何解释location后面的uri,这会使两者分别以不同的方式将请求映射到服务器文件上。
[root]
语法:root path
默认值:root html
配置段:http、server、location、if
[alias]
语法:alias path
配置段:location
实例:
location ~ ^/weblogs/ {
root /data/weblogs/www.ttlsa.com;
autoindex on;
auth_basic "Restricted";
auth_basic_user_file passwd/weblogs;
}
如果一个请求的URI是/weblogs/httplogs/www.ttlsa.com-access.log时,web服务器将会返回服务器上的/data/weblogs/www.ttlsa.com/weblogs/httplogs/www.ttlsa.com-access.log的文件。
[info]root会根据完整的URI请求来映射,也就是/path/uri。[/info]
因此,前面的请求映射为path/weblogs/httplogs/www.ttlsa.com-access.log。
location ^~ /binapp/ {
limit_conn limit 4;
limit_rate 200k;
internal;
alias /data/statics/bin/apps/;
}
alias会把location后面配置的路径丢弃掉,把当前匹配到的目录指向到指定的目录。如果一个请求的URI是/binapp/a.ttlsa.com/favicon时,web服务器将会返回服务器上的/data/statics/bin/apps/a.ttlsa.com/favicon.jgp的文件。
[warning]1. 使用alias时,目录名后面一定要加"/"。
2. alias可以指定任何名称。
3. alias在使用正则匹配时,必须捕捉要匹配的内容并在指定的内容处使用。
4. alias只能位于location块中。
本文出自 “宁静致远” 博客,谢绝转载!
Nginx将utf8编码的url解码成\x的16进制格式导致无法匹配静态文件的问题处理