首页 > 代码库 > 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 #当前请求的文件路径,由rootalias指令与URI请求生成,即root   

经过一系列优化等处理后实际指向的本地文件路径

 

2)rootalias区别:

nginx指定文件路径有两种方式rootaliasrootalias主要区别在于nginx如何解释location后面的uri,这会使两者分别以不同的方式将请求映射到服务器文件上。

[root]
语法:root path
默认值:root html
配置段:httpserverlocationif

[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进制格式导致无法匹配静态文件的问题处理