由于项目要求,系统需要支持中文文件名。
系统结构是nginx+tomcat。
首先是配置文件访问不经过tomcat。nginx直接触达资源:
给出一个例子,具体的nginx配置规则另行查阅。
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|ico|zip|mp4|woff|ttf|pdf|doc|docx|ppt|pptx|html)$ {
expires 1h;
autoindex on;
autoindex_exact_size off;
}
以这些后缀的文件,不经过Tomcat服务器,直接由nginx返回资源。
带中文路径的文件报404。
解决方案:
第一步:确认系统中文编码,命令:locale
正确显示:
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
如果不是的应该修改:vi /etc/sysconfig/i18n 文件不存在则新建。
按键i后输入
LANG=
"en_US.UTF-8"
SYSFONT=
"latarcyrheb-sun16"
然后Esc :wq保存退出。
source /etc/sysconfig/i18n 试编码立即生效。
第二步,修改nginx编码配置
charset utf-8,gbk;
放在location内外都可以,两种编码都支持。-s reload重新加载配置。
按说到这里中文文件就可以在url访问了,但是还是报404。
下面是重点,纠结了我半天!!!!
文件上传的时候,无论使用什么工具一定要修改utf-8编码格式上传,否则上传后中文名其实已经乱码了,只是看不出来。
以SecureCRT和SecureFx为例,如何修改可以参考,感谢作者!!!
https://blog.csdn.net/sp308036654/article/details/44595671
第三步,由于文件需要特殊权限控制,需要经过tomcat过滤。去掉上面nginx配置,改为如下:(只是一个例子,具体配置方法另查)
location ~ {
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Scheme $scheme;
client_body_buffer_size 10m;
proxy_connect_timeout 7200;
proxy_send_timeout 7200;
proxy_read_timeout 7200;
proxy_buffer_size 32k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
proxy_pass http://test;
expires 5s;
}
然后tomcat又报404!!!
tomcat打开conf文件下
web.xml文件下划线处有false改为true
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
server.xml文件添加下划线处
<Connector connectionTimeout="20000" port="8082" protocol="HTTP/1.1" redirectPort="8443" useBodyEncodingForURI="true" URIEncoding="UTF-8"/>
至此中文文件经由nginx转到tomcat,在经过tomcat权限过滤后也可访问了。