Nginx从入门到入土
Rewrite 规则
Rewrite规则可以实现对url的重写,以及重定向
指令语法:rewrite regex replacement [flag];
regex : 是代表要匹配的正则表达式,可以通过正则表达式提取变量
replacement : 要替换的url地址
flag : 是我们进行完替换之后,要进行的操作
常用正则表达式
字符 | 描述 |
\ | 将后面接着的字符标记为一个特殊字符或者一个原义字符或一个向后引用 |
^ | 匹配输入字符串的起始位置 |
$ | 匹配输入字符串的结束位置 |
* | 匹配前面的字符零次或者多次 |
+ | 匹配前面字符串一次或者多次 |
? | 匹配前面字符串的零次或者一次 |
. | 匹配除“\n”之外的所有单个字符 |
(pattern) | 匹配括号内的pattern |
flag参数
标记符号 | 说明 |
last | 本条规则匹配完成后继续向下匹配新的location URI规则 |
break | 本条规则匹配完成后终止,不在匹配任何规则 |
redirect | 返回302临时重定向 |
permanent | 返回301永久重定向 |
应用举例重写url路径
处理前:http://127.0.0.1:20001/rest/api/kernel
处理后:http://127.0.0.1:20001/api/kernel
location /rest {
proxy_pass http://127.0.0.1:20001;
proxy_connect_timeout 600;
proxy_read_timeout 600;
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Methods' '*';
add_header 'Access-Control-Allow-Headers' 'Authorization,AppInfo,Sign,X-Requested-With,*';
if ($request_method = 'OPTIONS') {
return 204;
}
rewrite "^/rest/(.*)$" /$1 break;
}
说明:()内为提取的变量,第一个提取的变量是$1
客户端真实ip
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Real-Port $remote_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
如何防止伪造
网上常见nginx配置ip请求头
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
风险: 用户可以通过自己设置请求头来伪造ip,比如用户在发起http请求是自己测试请求头x-forwarded-for:192.168.0.151。那么服务器通过x-forwarded-for获取到的第一个ip就是用户伪造的ip。
防止伪造方案:
情况1: 在只有1层nginx代理的情况下,设置nginx配置“proxy_set_header X-Forwarded-For remote_addr获取的是用户的真是ip)
情况2:在有多层反向代理的情况下,
1)设置“最外层”nginx配置和情况1一样“proxy_set_header X-Forwarded-For $remote_addr;”。
2)除了“最外层”之外的nginx配置“proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;”。
这样就防止了用户通过伪造请求头来伪造真实ip。后台只需要从x-forwarded-for请求头中取出第一个ip就是用户的真实ip。后面如果有多个ip,就是反向代理的ip
同理:X-Real-IP也差不多。
不同的是当只有1层nginx代理情况下只需配置“proxy_set_header X-Real-IP $remote_addr;”即可。
当有多层反向代理时,只在最外层代理设置“proxy_set_header X-Real-IP $remote_addr;”,如果在非最外层设置,则获取到的是反向代理机器的ip