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作为Nginx的一个扩展模块,进一步提升了其在处理HTTP头部信息时的灵活性和功能性。本文将详细探讨这个0.34版本的headers_more_nginx_module,带你深入了解它如何助力优化和管理HTTP响应...
完成编译和安装后,你需要在Nginx的配置文件中定义一个location块来处理文件上传。下面是一个基本的配置示例: ``` location /upload { client_max_body_size 50M; # 设置允许的最大上传文件大小 upload_pass @...
在Nginx中,它使用`X-Accel-Redirect`头来指示Nginx直接从服务器的内部路径发送文件,而不是通过PHP读取和发送。这种方式减轻了PHP的负担,同时利用了Nginx处理静态文件的高效性能,支持缓存和断点续传等优化功能。 ...
Dokku Nginx 缓存 ... 但是,Nginx 确实遵守许多与缓存和X-Accel-*相关的标头。 来自片段: X-Accel-Expires 、 Expires 、 Cache-Control 、 Set-Cookie和Vary设置响应的参数; X-Accel-Redirect执行到指定
6. **缓存更新策略**:当后端内容更新时,可以设置`proxy_cache_revalidate`或`fastcgi_cache_revalidate`让Nginx在缓存过期前尝试验证内容是否已更改。 通过合理配置和优化,Nginx的缓存机制能显著提高网站的响应...
但是这个 zip 模块只能使用本地文件来打包。如果需要打包输出的文件来自网络,就得先保存临时文件。在文件数量多或者文件大的时候就很杯具。... nginx 有一个第三方模块,mod_...加上这个响应头,nginx zip 模块就会处理响
其中,X-Accel-Redirect头用于指定文件的实际存在地址,nginx服务器将根据这个头信息将请求redirect到实际文件存在的地址。 这个实例的优点是轻量级、灵活性强、降低了对后端Java服务器的负载冲击同时也提高了文件...
6. **Nginx的X-Accel-Redirect:** Nginx服务器提供了类似的功能,但使用X-Accel-Redirect头。Nginx需要知道一个内部路径,这个路径对客户端不可见,但Nginx可以根据这个路径找到文件并发送。 7. **性能优势:** ...
Nginx提供了“x-accel-redirect”和“map”指令来处理多站点的伪静态需求。以下是两个常见的配置示例: 1. **子目录模式**: 在Nginx配置文件中,你可以定义两个`map`指令,一个用于识别博客路径,另一个用于获取...
Nginx提供了两种特殊的指令:”x-accel-redirect”和”map”,使用这两个指令可以使得wordpress多站点的网络服务实现伪静态功能。 wordpress多站点使用子目录重写规则 配置中shouce.ren修改为自己的站点域名。 map $...
例如,可以在nginx配置文件中添加如下配置来忽略X-Accel-Expires、Expires、Cache-Control和Set-Cookie头部信息: proxy_ignore_headers X-Accel-Expires Expires Cache-Control Set-Cookie; 此外,NGINX缓存配置...
proxy_ignore_headers X-Accel-Expires Expires Cache-Control Set-Cookie; ``` 这条指令告诉nginx忽略特定的HTTP响应头。通过这种方式,即使源服务器返回的响应头中包含上述禁止缓存的指令,nginx也会根据自己的...
在Web开发中,实时输出是指服务器端的输出即时地发送给客户端,而不是在处理完毕后一次性发送。这种技术常用于实时通信,如聊天应用、游戏、实时监控等领域,可以显著提升用户体验。PHP和Nginx作为常用的服务器端...
* `http_port 80 accel vhost vport`:监听80端口,处理来自用户的HTTP请求,并提供Web服务。 * `cache_peer 192.168.81.132`:如果访问请求在Squid服务器本地缓存中没有命中,则将请求转发给上级节点以寻找用户内容...
在这种配置下,为了确保PHP输出可以及时发送到客户端,可能需要在PHP脚本中设置一个HTTP响应头X-Accel-Buffering:no。这个设置可以禁用nginx的代理缓冲和fastcgi缓冲,从而确保PHP脚本的输出能够不经过缓冲直接到达...