中间件

NGINX踩坑…持续更新

admin · 7月29日 · 2020年

最近初学nginx,把踩到的坑记录

1.root与alias

[root]
语法: root path
段落: http server location

[alias]
语法: alias path
段落: location
-------------------------------------------------------------------------------------------------
location /abc/ {   
    root /home/html/abc;
    index index.html
}
这个指向的是/home/html/abc/abc/这个目录

path=$root+$location+$index=/home/html/abc+/abc+/index.html
=/home/html/abc/abc/index.html

location /abc/ {   
    alias /home/html/abc/;
    index index.html
}
这个配置实际上指向的是/home/html/abc/目录。

path=$root+$location=/home/html/abc/+index.html
alias是将location中的匹配项去除,所以alias指定的路径最后必须加/

2.精准匹配(=)

/usr/share/nginx下有html和html2两个目录        
--------------------------------------------------------------------        
        location / {
        root /usr/share/nginx/html;   
        index  index.html index.htm;
        }
    
        location = /html2/ {
        root /usr/share/nginx;
        index        index.html;
        } 
当访问http://localhost/时,实际访问的是http://localhost/index.html,所以匹配到第一个location
当访问http://localhost/html2/时,实际访问的是http://localhost/html2/index.html,匹配到第一个location
此时uri变成path=$+/html2/index.html=/usr/share/nginx/html+/html2/index.html
实际没有该路径,所以返回404

--------------------------------------------------------------------
此时应该使用普通匹配
        location / {
        root /usr/share/nginx/html;   
        index  index.html index.htm;
        }
    
        location  /html2/ {
        root /usr/share/nginx;
        index        index.html;
        } 

--------------------------------------------------------------------
或前缀匹配
        location / {
        root /usr/share/nginx/html;   
        index  index.html index.htm;
        }
    
        location ^~ /html2/ {
        root /usr/share/nginx;
        index        index.html;
        } 

--------------------------------------------------------------------
或完全精准匹配
        location / {
        root /usr/share/nginx/html;   
        index  index.html index.htm;
        }
    
        location = /html2/index.html {
        root /usr/share/nginx;
        index        index.html;
        } 

3.wordpress的反向代理

由于特殊原因,wordpress只能部署在家里(主要想省钱),想要通过VPS反向代理访问已实现去端口,其他网站都很轻松解决,唯有wordpress,因为它有不少链接是绝对路径,所以不做特殊处理一般只能看到首页,往其他页面跳转就会失效,解决方法也很简单,通过sub_filter 把域名进行替换就行了

location /{
        proxy_set_header  Accept-Encoding  "";
        proxy_pass https://blog.luckinserver.cn:88;
        sub_filter https://blog.luckinserver.cn:88 http://luckinserver.cn;
        sub_filter_once off; 
} 

以上可以实现http://luckinserver.cn对https://blog.luckinserver.cn:88的替换

proxy_set_header Accept-Encoding “”;  可以让nginx 不发送 Accept-Encoding HTTP header。这个时候,wordpress 返回的页面是不做 gzip压缩的。因为gzip 压缩之后,文本替换就会失效了。