技术解析

求助 nginx 大神看看这个奇怪的问题
0
2021-05-20 19:27:17
idczone

配置如下

美国服务器
location ~* ^/a(.*)/(.*)$ {

	set $c $1;

	set $d $2;

	alias /var/www/xx.xxx.xxx/a$c/$d;

	fancyindex on;

	fancyindex_exact_size off;

	fancyindex_localtime on;

	if ( $d ~* .*\.(txt|log|js|css)$) {

		more_clear_headers "content-type";       
    
		add_header Content-Type text/plain;     
    
	}
}

现在的问题是访问 xx.xxx.xxx/axx/ 下面任何带有中文或者空格的资源(非 txt,log,js,css 结尾的)的时候都会 404,日志我也看了,编码没有问题。只要把 if 语句去掉就 OK。是在找不到原因了。 大佬求助


萌新的想法:正则写对了吗

1. 不要用 if,把 if 换成
location ~* .*\.(txt|log|js|css)$
2. $c 和$d 没有任何意义,怕$1 有歧义的话用 named capture
3. error.log

照你的意思,英文没问题是么?
那就九成九是编码,或者 LANG
你怎么安装和启动 nginx 的?

最后 -d 是判断目录是否存在
RTFM

root /var/www/xx.xxx.xxx/;
location /a {
fancyindex on;
fancyindex_exact_size off;
fancyindex_localtime on;
if ( $d ~* .*\.(txt|log|js|css)$) {
more_clear_headers "content-type";

add_header Content-Type text/plain;

}
}

root /var/www/xx.xxx.xxx/;
location /a {
fancyindex on;
fancyindex_exact_size off;
fancyindex_localtime on;
location ~* .(txt|log|js|css)$ {
more_clear_headers "content-type";
add_header Content-Type text/plain;
}
}
更好的办法是修改 /etc/nginx/mime.types

没仔细看,先提醒一句 nginx if 里面不能有 rewrite 和 return 之外的指令。
你可以搜索 nginx if is evil

理论上这种还是可以的,毕竟是基于路径的 if。但是有没有坑,我也说不清楚。
rewrite 因为是同模块所以肯定没事
return 因为立刻终止,所以一般也没事。
其他的具体分析太复杂,除非对 rewrite 和里面的指令的相关模块非常熟悉,很难判断。
if 最主要的坑在于,对于其他模块的指令,会生成两份配置,然后切换。然而 nginx 的指令是 declarative 的,所以实际上不保证顺序(虽然有 phase 会分隔)。if 执行的时候,可能相关变量根本不可用,或者里面的指令已经执行过了。
不过正常人都是去改 /etc/nginx/mime.types
或者加一个 types
http://nginx.org/en/docs/http/ngx_http_core_module.html#types

用好嵌套 location 和 map 可以消除绝大多数 if
if 是 map 出现前的,仿 apache 的,不 nginx 的产物
用 if,出什么问题都是活该

在这里统一感谢各位,最后重写了 mime.types 搞定,因为规则比较多,还有其他业务,不能直接改 /etc/nginx/mime.types,另外搞了一份 types,然后在 location 里面使用 include /etc/nginx/XXX.types;

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服