`
mobilezht
  • 浏览: 1479 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

在NGINX的x-accel 处理中文

阅读更多

NGINX的x-accel 是非常强大的功能,将WebServer 从文件处理中解脱出来。还能控制带宽等,实在是 处理大量文件必备良药。

NGINX的x-accel 机制也很巧妙。你通过一个HTTP标识 告诉 NGINX 传什么文件,那就传什么文件,完全的黑盒子。

可是,HTTP标识 是放在 HTTP HEAD 中,很多情况下 HTTP HEAD 只能放英文。咱们中国人就不是很方便咯,还有GBK /UTF-8 的 多种字符集,真是坑爹啊。

比如NETTY 就按照ASICII 来 处理 HTPP HEAD。不幸的是,我采用的PLAY framework 正是以NETTY 为基础。

             

修改NETTY  的难度非常大。虽然只是将原JAVA 文件中的ASIC删除,再打包,也容易有太多的不兼容问题。尼玛都扎堆坑爹来了。

好在还有几年的C基础。看了看,NGINX 的代码很清晰,很快找到了 处理x_accel_redirect的地方:

  /nginx-1.0.1/src/http|ngx_http_upstream.c
   1822: 原代码      uri = &u->headers_in.x_accel_redirect->value;
   1822: 新增代码    uri -> len = urldecode(uri->data,uri -> len);



附送 C 实现 urldecode

/**

* @param str 需要解码的url字符串
* @param len 需要解码的url的长度
* @return int 返回解码后的url长度
*/

static int urldecode(char *str, int len)
{
	char *dest = str;	
	char *data = str;	
	int value;	
	int c;	
	while (len--) {	
		if (*data == '+') {		
			*dest = ' ';	
		}else if (*data == '%' && len >= 2 && isxdigit((int) *(data + 1))
                                 && isxdigit((int) *(data + 2)))	{	
			c = ((unsigned char *)(data+1))[0];
            if (isupper(c))
                c = tolower(c);
            value = (c >= '0' && c <= '9' ? c - '0' : c - 'a' + 10) * 16;
            c = ((unsigned char *)(data+1))[1];
            if (isupper(c))
                c = tolower(c);
            value += c >= '0' && c <= '9' ? c - '0' : c - 'a' + 10;

			*dest = (char)value ;			
			data += 2;			
			len -= 2;			
		} else {
			*dest = *data;
		}
		data ++;	
		dest ++;	
	}	
	*dest = '\0';
	return dest - str;
}




哈哈,测试一下 OK,收工咯。。。。

 


有人说不会用???

        String f = "文件名.doc"; //没有 预审报名%D4%A4%C9%F3%B1%A8%C3%FB.doc";
        Logger.info(f);
        String attachment_file_name;
              try {
          attachment_file_name = URLEncoder.encode(f,"GBK");     
                  Logger.debug( attachment_file_name);
        } catch (UnsupportedEncodingException e) {
            attachment_file_name = f;
              Logger.debug("UnsupportedEncodingException"+ f);
        }                
       	response.setHeader("X-Accel-Redirect", "/files/file_path/" +attachment_file_name);


    NGINX 的配置文件

location /files/ {
		[size=medium][color=red] internal;[/color][/size]
		 charset gbk;
}

 

分享到:
评论

相关推荐

    headers-more-nginx-module-0.34

    而headers_more_nginx_module作为Nginx的一个扩展模块,进一步提升了其在处理HTTP头部信息时的灵活性和功能性。本文将详细探讨这个0.34版本的headers_more_nginx_module,带你深入了解它如何助力优化和管理HTTP响应...

    Nginx文件上传模块配置

    完成编译和安装后,你需要在Nginx的配置文件中定义一个location块来处理文件上传。下面是一个基本的配置示例: ``` location /upload { client_max_body_size 50M; # 设置允许的最大上传文件大小 upload_pass @...

    在Nginx中使用X-Sendfile头提升PHP文件下载的性能(针对大文件下载)

    在Nginx中,它使用`X-Accel-Redirect`头来指示Nginx直接从服务器的内部路径发送文件,而不是通过PHP读取和发送。这种方式减轻了PHP的负担,同时利用了Nginx处理静态文件的高效性能,支持缓存和断点续传等优化功能。 ...

    dokku-nginx-cache

    Dokku Nginx 缓存 ... 但是,Nginx 确实遵守许多与缓存和X-Accel-*相关的标头。 来自片段: X-Accel-Expires 、 Expires 、 Cache-Control 、 Set-Cookie和Vary设置响应的参数; X-Accel-Redirect执行到指定

    深入Nginx + PHP 缓存详解

    6. **缓存更新策略**:当后端内容更新时,可以设置`proxy_cache_revalidate`或`fastcgi_cache_revalidate`让Nginx在缓存过期前尝试验证内容是否已更改。 通过合理配置和优化,Nginx的缓存机制能显著提高网站的响应...

    php调用nginx的mod_zip模块打包ZIP文件

    但是这个 zip 模块只能使用本地文件来打包。如果需要打包输出的文件来自网络,就得先保存临时文件。在文件数量多或者文件大的时候就很杯具。... nginx 有一个第三方模块,mod_...加上这个响应头,nginx zip 模块就会处理响

    Java及nginx实现文件权限控制代码实例

    其中,X-Accel-Redirect头用于指定文件的实际存在地址,nginx服务器将根据这个头信息将请求redirect到实际文件存在的地址。 这个实例的优点是轻量级、灵活性强、降低了对后端Java服务器的负载冲击同时也提高了文件...

    在PHP中使用X-SendFile头让文件下载更快

    6. **Nginx的X-Accel-Redirect:** Nginx服务器提供了类似的功能,但使用X-Accel-Redirect头。Nginx需要知道一个内部路径,这个路径对客户端不可见,但Nginx可以根据这个路径找到文件并发送。 7. **性能优势:** ...

    WordPress中开启多站点支持及Nginx的重写规则配置

    Nginx提供了“x-accel-redirect”和“map”指令来处理多站点的伪静态需求。以下是两个常见的配置示例: 1. **子目录模式**: 在Nginx配置文件中,你可以定义两个`map`指令,一个用于识别博客路径,另一个用于获取...

    wordpress nginx多站点rewrite(重写)规则

    Nginx提供了两种特殊的指令:”x-accel-redirect”和”map”,使用这两个指令可以使得wordpress多站点的网络服务实现伪静态功能。 wordpress多站点使用子目录重写规则 配置中shouce.ren修改为自己的站点域名。 map $...

    nginx cache不缓存问题的原因与解决方案

    例如,可以在nginx配置文件中添加如下配置来忽略X-Accel-Expires、Expires、Cache-Control和Set-Cookie头部信息: proxy_ignore_headers X-Accel-Expires Expires Cache-Control Set-Cookie; 此外,NGINX缓存配置...

    nginx缓存不起作用问题解决方法

    proxy_ignore_headers X-Accel-Expires Expires Cache-Control Set-Cookie; ``` 这条指令告诉nginx忽略特定的HTTP响应头。通过这种方式,即使源服务器返回的响应头中包含上述禁止缓存的指令,nginx也会根据自己的...

    php nginx 实时输出的简单实现方法

    在Web开发中,实时输出是指服务器端的输出即时地发送给客户端,而不是在处理完毕后一次性发送。这种技术常用于实时通信,如聊天应用、游戏、实时监控等领域,可以显著提升用户体验。PHP和Nginx作为常用的服务器端...

    CDN搭建流程.docx

    * `http_port 80 accel vhost vport`:监听80端口,处理来自用户的HTTP请求,并提供Web服务。 * `cache_peer 192.168.81.132`:如果访问请求在Squid服务器本地缓存中没有命中,则将请求转发给上级节点以寻找用户内容...

    PHP flush 函数使用注意事项

    在这种配置下,为了确保PHP输出可以及时发送到客户端,可能需要在PHP脚本中设置一个HTTP响应头X-Accel-Buffering:no。这个设置可以禁用nginx的代理缓冲和fastcgi缓冲,从而确保PHP脚本的输出能够不经过缓冲直接到达...

Global site tag (gtag.js) - Google Analytics