首页 > Web开发 > 详细

Nginx将utf8编码的url解码成\x的16进制格式导致无法匹配静态文件的问题处理

时间:2016-10-25 03:36:24      阅读:1077      评论:0      收藏:0      [点我收藏+]

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

原文:http://woodpecker.blog.51cto.com/2349932/1865073

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!