精华内容
下载资源
问答
  • 2021-10-24 13:27:38

    一、Nginx代理后端服务

    • nginx 服务器及端口 127.0.0.1:80
    • 后端服务:127.0.0.1:8080
    • 测试url:http://127.0.0.1:80/day06api/api/abc

    1.配置

    nginx配置如下:

    location /day06api/ {
       proxy_pass http://127.0.0.1:8080/;
    }
    

    实际访问的端口服务:http://127.0.0.1:8080/api/ab

    2.配置

    nginx配置如下:

    location /day06api {
       proxy_pass http://127.0.0.1:8080/;
    }
    

    实际访问的端口服务:http://127.0.0.1:8080//api/abc

    3.配置

    nginx配置如下:

    location /day06api/ {
       proxy_pass http://127.0.0.1:8080;
    }
    

    实际访问的端口服务:http://127.0.0.1:8080/day06api/api/abc

    4.配置

    nginx配置如下:

    location /day06api {
       proxy_pass http://127.0.0.1:8080;
    }
    

    实际访问的端口服务:http://127.0.0.1:8080/day06api/api/abc

    5.配置

    nginx配置如下:

    location /day06api/ {
       proxy_pass http://127.0.0.1:8080/server/;
    }
    
    

    实际访问的端口服务:http://127.0.0.1:8080/server/api/abc

    6.配置

    nginx配置如下:

    location /day06api {
       proxy_pass http://127.0.0.1:8080/server/;
    }
    

    实际访问的端口服务:http://127.0.0.1:8080/server//api/abc

    7.配置

    nginx配置如下:

    ocation /day06api/ {
       proxy_pass http://127.0.0.1:8080/server;
    }
    
    

    实际访问的端口服务:http://127.0.0.1:8080/serverapi/abc

    8.配置

    nginx配置如下:

    location /day06api {
       proxy_pass http://127.0.0.1:8080/server;
    }
    

    实际访问的端口服务:http://127.0.0.1:8080/server/api/abc

    注意:

    1、proxy_pass ip+port后面有斜杠\或者路径,新的ip路径是:

    proxy_pass + 访问路径除去location相同部分路径。

    2、proxy_pass 只有ip+port,新的路径:

    proxy_pass + location + 访问路径除去location相同路径。

    二、Nginx代理前端页面

    1.root和alias使用位置:

    • root指令可以位于http、server、location中;
    • alias指令只能位于location中;

    2.当两者都位于location中时, 对于符合location规则的URI处理方式不同:

    • 使用root指令,实际指向服务器文件的路径中,包含location路径,root+location+加上访问路径除去location相同部分的路径。
    • 使用alias指令,实际指向服务器文件路径中,不包含location路径,alias + 加上访问路径中除去location后的路径。

    注意:

    使用root时path后面有没有斜杠\都可以;使用alias时path一定要有斜杠\

    3.try_files配置静态页面

    #第一种:location没有/
    location /benjamin {
        try_files $uri $uri/ /index.html;
            
    }
    
    #第二种:location有/
    location /benjamin/ {  
        try_files $uri $uri/ /index.html;
            
    }
    
    
    

     区别:

    location没有/访问的路径:$uri + location + 路径中除location路径以外的路径。

    location有/访问路径:$uri + 路径中除location路径以外的路径。

    4.rewrite重写

    规则:

    rewrite "用来匹配路径的正则" 重写后的路径 [指令];

    需要进行重写,$1.$2来引用变量
    #rewrite "用来匹配路径的正则" 重写后的路径 [指令];
        location /api/upload {
        proxy_pass http://127.0.0.1:8082;
        proxy_connect_timeout 600;
        proxy_read_timeout 600;
        rewrite "^/api/(.*)$" /$1 break;
    }

    指令:常用的有2个,分别是:last、break

    last:重写路径结束后,将得到的路径重新进行一次nginx路径匹配

    break:重写路径结束后,不再重新匹配路径

    redirect: 外部跳转,重定向地址会变

    permanent:和redirect相似

    没有任何修饰:会继续向下面的location地址进行匹配,用最后一个匹配的

    三、nginx配置文件

    ########   Nginx的main(全局配置)文件
    #指定nginx运行的用户及用户组,默认为nobody
    #user  nobody;
    
    #开启的线程数,一般跟逻辑CPU核数一致
    worker_processes  1;
    
    #定位全局错误日志文件,级别以notice显示,还有debug,info,warn,error,crit模式,debug输出最多,crir输出最少,根据实际环境而定
    error_log  logs/error.log;
    error_log  logs/error.log  notice;
    error_log  logs/error.log  info;
    
    #指定进程id的存储文件位置
    pid        logs/nginx.pid;
    
    #指定一个nginx进程打开的最多文件描述符数目,受系统进程的最大打开文件数量限制
    worker_rlimit_nofile 65535
    
    events {
        #设置工作模式为epoll,除此之外还有select,poll,kqueue,rtsig和/dev/poll模式
        use epoll;
    
        #定义每个进程的最大连接数,受系统进程的最大打开文件数量限制。
        worker_connections  1024;
    }
    
    #######Nginx的Http服务器配置,Gzip配置
    http {
        #主模块指令,实现对配置文件所包含的文件的设定,可以减少主配置文件的复杂度,DNS主配置文件中的zonerfc1912,acl基本上都是用include语句。
        include       mime.types;
    
        #核心模块指令,智力默认设置为二进制流,也就是当文件类型未定义时使用这种方式
        default_type  application/octet-stream;
    
        #下面代码为日志格式的设定,main为日志格式的名称,可自行设置,后面引用
        #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
        #                  '$status $body_bytes_sent "$http_referer" '
        #                  '"$http_user_agent" "$http_x_forwarded_for"';
    
        #引用日志main
        #access_log  logs/access.log  main;
    
        #设置允许客户端请求的最大的单个文件字节数
        client_max_body_size 20M;
        #指定来自客户端请求头的headebuffer大小
        client_header_buffer_size  32k;
        #指定连接请求试图写入缓存文件的目录路径
        client_body_temp_path /dev/shm/client_body_temp;
        #指定客户端请求中较大的消息头的缓存最大数量和大小,目前设置为4个32KB
        large client_header_buffers 4 32k;
    
        #开启高效文件传输模式
        sendfile        on;
        #开启防止网络阻塞
        #tcp_nopush     on;
        #开启防止网络阻塞
        #tcp_nodelay    on;
    
        #设置客户端连接保存活动的超时时间
        #keepalive_timeout  0;
        keepalive_timeout  65;
    
        #设置客户端请求读取超时时间
        client_header_timeout 10;
        #设置客户端请求主体读取超时时间
        client_body_timeout 10;
        #用于设置相应客户端的超时时间
        send_timeout
    
        ####HttpGZip模块配置
        #httpGzip modules
        #开启gzip压缩
        #gzip  on;
        #设置允许压缩的页面最小字节数
        #gzip_min_length 1k;
        #申请4个单位为16K的内存作为压缩结果流缓存
        #gzip_buffers 4 16k;
        #设置识别http协议的版本,默认为1.1
        #gzip_http_version 1.1;
        #指定gzip压缩比,1-9数字越小,压缩比越小,速度越快
        #gzip_comp_level 2;
        #指定压缩的类型
        #gzip_types text/plain application/x-javascript text/css application/xml;
        #让前端的缓存服务器进过gzip压缩的页面
        #gzip_vary on;
    
        #########Nginx的server虚拟主机配置
        server {
            #监听端口为 80
            listen       80;
    
            #设置主机域名
            server_name  localhost;
    
            #设置访问的语言编码
            #charset koi8-r;
    
            #设置虚拟主机访问日志的存放路径及日志的格式为main
            #access_log  logs/host.access.log  main;
    
            #设置虚拟主机的基本信息
            location / {
                #设置虚拟主机的网站根目录
                root   html;
    
                #设置虚拟主机默认访问的网页
                index  index.html index.htm;
            }
    
            #error_page  404              /404.html;
    
            # redirect server error pages to the static page /50x.html
            #
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
    
            # proxy the PHP scripts to Apache listening on 127.0.0.1:80
            #
            #location ~ \.php$ {
            #    proxy_pass   http://127.0.0.1;
            #}
    
            # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
            #
            #location ~ \.php$ {
            #    root           html;
            #    fastcgi_pass   127.0.0.1:9000;
            #    fastcgi_index  index.php;
            #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
            #    include        fastcgi_params;
            #}
    
            # deny access to .htaccess files, if Apache's document root
            # concurs with nginx's one
            #
            #location ~ /\.ht {
            #    deny  all;
            #}
        }
    
    
        # another virtual host using mix of IP-, name-, and port-based configuration
        #
        #server {
        #    listen       8000;
        #    listen       somename:8080;
        #    server_name  somename  alias  another.alias;
    
        #    location / {
        #        root   html;
        #        index  index.html index.htm;
        #    }
        #}
    
    
        # HTTPS server
        #
        #server {
        #    listen       443 ssl;
        #    server_name  localhost;
    
        #    ssl_certificate      cert.pem;
        #    ssl_certificate_key  cert.key;
    
        #    ssl_session_cache    shared:SSL:1m;
        #    ssl_session_timeout  5m;
    
        #    ssl_ciphers  HIGH:!aNULL:!MD5;
        #    ssl_prefer_server_ciphers  on;
    
        #    location / {
        #        root   html;
        #        index  index.html index.htm;
        #    }
        #}
    
    }
    更多相关内容
  • Location IOS12.3驱动

    千次下载 热门讨论 2019-05-07 09:04:06
    Location你们懂的,谢谢那些大佬的分享。前段时间把手机系统升级成测试版IOS12.3了,导致一直找不到驱动,今天有幸在@_小呵呵 的博客里找到DeviceSupport 12.3。修改了一下名字验证能用。 查看博客!有链接
  • 由于高德地图API升级的太快,导致之前能用的几乎都没了,这个LocationManagerProxy类在Android_Location_V1.3.0还能用,好不容找到,这个,现在分享一下这个包
  • Nginx location 匹配

    千次阅读 2022-04-02 10:31:55
    Nginx location 匹配

    location匹配顺序

    示例配置代码

    user  root root;
    worker_processes  1;
    
    #error_log  logs/error.log;
    #error_log  logs/error.log  notice;
    #error_log  logs/error.log  info;
    
    #pid        logs/nginx.pid;
    
    #worker_rlimit_nofile 655350;
    events {
        worker_connections  1024;
    }
    
    http {
        include       mime.types;
        default_type  application/octet-stream;
    
        #access_log  logs/access.log  main;
    
        sendfile        on;
        #tcp_nopush     on;
    
        #keepalive_timeout  0;
        keepalive_timeout  65;
        client_max_body_size 1024m;
    
        #gzip  on;
    
        server {
            listen       8090;
            server_name  localhost;
    
            #charset koi8-r;
    
            #access_log  logs/host.access.log  main;
    
            location / {
                root   html;
                index  index.html index.htm;
            }
            
            #error_page  404             /404.html;
    
            # redirect server error pages to the static page /50x.html
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
    
    		location /aa-web {
    			#root /home/abc/nginx/html;
    			index  index.html index.htm;
    			try_files $uri $uri/ /aa-web/index.html;
            }
    
            location ^~ /aa-server {
                    proxy_pass http://192.168.1.80:18081;
                    proxy_redirect off;
                    proxy_set_header Host $http_host;
                    proxy_set_header X-Real-IP $remote_addr;
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                    chunked_transfer_encoding off;
                    client_max_body_size 100m;
                    # rewrite ^/aa-server/?(.*)$ /$1 break;
                    #proxy_port off;
                    #proxy_set_header X-Forwarded-Proto $scheme;
            }
    	}
    }
    

    nginx有两层指令来匹配请求 URI 。第一个层次是 server 指令,它通过域名、ip 和端口来做第一层级匹配,当找到匹配的 server 后就进入此 server 的 location 匹配。

    location 的匹配并不完全按照其在配置文件中出现的顺序来匹配,请求URI 会按如下规则进行匹配:

    1、先精准匹配 = ,精准匹配成功则会立即停止其他类型匹配;
    2、没有精准匹配成功时,进行前缀匹配。先查找带有 ^~ 的前缀匹配,带有 ^~ 的前缀匹配成功
    则立即停止其他类型匹配,普通前缀匹配(不带参数 ^~ )成功则会暂存,继续查找正则匹配;
    3、= 和 ^~ 均未匹配成功前提下,查找正则匹配 ~ 和 ~* 。当同时有多个正则匹配时,按其在配置文件中出现的
    先后顺序优先匹配,命中则立即停止其他类型匹配;
    4、所有正则匹配均未成功时,返回步骤 2 中暂存的普通前缀匹配(不带参数 ^~ )结果
    

    location 支持的语法 location [=||*|^~|@] pattern { … },乍一看还挺复杂的,来逐个看一下。
    以上规则简单总结就是优先级从高到低依次为(序号越小优先级越高):

    1. location =    # 精准匹配
    2. location ^~   # 带参前缀匹配
    3. location ~    # 正则匹配(区分大小写)
    4. location ~*   # 正则匹配(不区分大小写)
    5. location /a   # 普通前缀匹配,优先级低于带参数前缀匹配。
    6. location /    # 任何没有匹配成功的,都会匹配这里处理
    

    location修饰符类型

    「=」 修饰符:要求路径完全匹配

    server {
        server_name website.com;
        location = /abcd {
        […]
        }
    }
    
    • http://website.com/abcd匹配
    • http://website.com/ABCD可能会匹配 ,也可以不匹配,取决于操作系统的文件系统是否大小写敏感(case-sensitive)。ps: Mac 默认是大小写不敏感的,git 使用会有大坑。
    • http://website.com/abcd?param1&param2匹配,忽略 querystring
    • http://website.com/abcd/不匹配,带有结尾的/
    • http://website.com/abcde不匹配

    「~」修饰符:区分大小写的正则匹配

    server {
        server_name website.com;
        location ~ ^/abcd$ {
        […]
        }
    }
    

    ^/abcd$这个正则表达式表示字符串必须以/开始,以$结束,中间必须是abcd

    • http://website.com/abcd匹配(完全匹配)
    • http://website.com/ABCD不匹配,大小写敏感
    • http://website.com/abcd?param1&param2匹配
    • http://website.com/abcd/不匹配,不能匹配正则表达式
    • http://website.com/abcde不匹配,不能匹配正则表达式

    「~*」不区分大小写的正则匹配

    server {
        server_name website.com;
        location ~* ^/abcd$ {
        […]
        }
    }
    
    • http://website.com/abcd匹配 (完全匹配)
    • http://website.com/ABCD匹配 (大小写不敏感)
    • http://website.com/abcd?param1&param2匹配
    • http://website.com/abcd/ 不匹配,不能匹配正则表达式
    • http://website.com/abcde 不匹配,不能匹配正则表达式

    「^~」修饰符:前缀匹配

    如果该 location 是最佳的匹配,那么对于匹配这个 location 的字符串, 该修饰符不再进行正则表达式检测。注意,这不是一个正则表达式匹配,它的目的是优先于正则表达式的匹配
    查找的顺序及优先级
    当有多条 location 规则时,nginx 有一套比较复杂的规则,优先级如下:

    - 精确匹配 =
    - 前缀匹配 ^~(立刻停止后续的正则搜索)
    - 按文件中顺序的正则匹配 ~或~*
    - 匹配不带任何修饰的前缀匹配。
    

    这个规则大体的思路是
    先精确匹配,没有则查找带有 ^~的前缀匹配,没有则进行正则匹配,最后才返回前缀匹配的结果(如果有的话)

    案例分析

    案例 1

    server {
        server_name website.com;
        location /doc {
            return 701; # 用这样的方式,可以方便的知道请求到了哪里
        }
        location ~* ^/document$ {
            return 702; # 用这样的方式,可以方便的知道请求到了哪里
    
        }
    }
    

    curl -I website.com:8080/document HTTP/1.1 702
    按照上述的规则,第二个会有更高的优先级

    案例2

    server {
        server_name website.com;
        location /document {
            return 701;
        }
        location ~* ^/document$ {
            return 702;
        }
    }
    

    curl -I website.com:8080/document
    第二个匹配了正则表达式,优先级高于第一个普通前缀匹配

    案例 3

    server {
        server_name website.com;
        location ^~ /doc {
            return 701;
        }
        location ~* ^/document$ {
            return 702;
        }
    }
    

    curl http://website.com/document HTTP/1.1 701
    第一个前缀匹配^~命中以后不会再搜寻正则匹配,所以会第一个命中

    案例 4

    server {
        server_name website.com;
        location /docu {
            return 701;
        }
        location /doc {
            return 702;
        }
    }
    

    curl -I website.com:8080/document 返回 HTTP/1.1 701,

    server {
        server_name website.com;
        location /doc {
            return 702;
        }
        location /docu {
            return 701;
        }
    }
    

    curl -I website.com:8080/document 依然返回 HTTP/1.1 701
    前缀匹配下,返回最长匹配的 location,与 location 所在位置顺序无关

    案例 5

    server {
    	listen 8080;
    	server_name website.com;
    
        location ~ ^/doc[a-z]+ {
            return 701;
        }
    
        location ~ ^/docu[a-z]+ {
            return 702;
        }
    }
    

    curl -I website.com:8080/document 返回 HTTP/1.1 701
    把顺序换一下

    server {
    	listen 8080;
    	server_name website.com;
    
        location ~ ^/docu[a-z]+ {
            return 702;
        }
        
        location ~ ^/doc[a-z]+ {
            return 701;
        }
    }
    

    curl -I website.com:8080/document 返回 HTTP/1.1 702
    正则匹配是使用文件中的顺序,找到返回


    常见问题

    1、location 路径替换
    在这里插入图片描述

    展开全文
  • nginx location 常用配置示例

    千次阅读 多人点赞 2021-08-29 12:59:51
    nginx location 常用配置示例 1、location 匹配规则 官方文档 location location = / { [ configuration A ] } location / { [ configuration B ] } location /documents/ { [ configuration C ] } ...

    nginx location 常用配置示例


    1、location 匹配规则

    location = / {
        [ configuration A ]
    }
    
    location / {
        [ configuration B ]
    }
    
    location /documents/ {
        [ configuration C ]
    }
    
    location ^~ /images/ {
        [ configuration D ]
    }
    
    location ~* \.(gif|jpg|jpeg)$ {
        [ configuration E ]
    }
    # "/"请求将匹配 configuration A
    # "/index.html"请求将匹配 configuration B
    # "/documents/document.html"请求将匹配 configuration C
    # "/images/1.gif"请求将匹配 configuration D
    # "/documents/1.jpg"请求将匹配 configuration E
    

    以下面这个为例:

    location /a {}  # 1
    
    location /b {}  # 2
    
    location ^~ /a/b {}  # 3
    
    location ~* /a.* {}  # 4
    
    location ~* /.* {}  # 5
    
    location = /a/b {}  # 6
    

    匹配规则是 :

    • 例如,请求是 " /a/b "

    • 1、完全匹配优先级最高 ( " = /a/b " ,编号6 ),匹配完成结束搜索。

    • 2、如果没有完全匹配,优先找最长匹配前缀 ( 也就是 " /a/b ",编号3 ) ,再看 " /a/b " 前面有没有 ^~ 修辞

    • 3、如果有 ^~ 修辞,那匹配结束,结果是 " /a/b "

    • 4、如果没有 ^~ 修辞,还将继续匹配正则,正则匹配按照从上到下的顺序,如上面 编号4和5都能满足匹配规则,但是4在上面,所以结果是编号4,结束匹配

    • 5、如果所有正则都没匹配上,那结果还是 " /a/b ",编号3

    具体挑几种情况说明:

    case 1:

    location /a {}
    
    location /a/ {}
    
    location /b {}
    

    请求 " /a/b " 会匹配到第二个" /a/ " ,因为是最长匹配前缀

    case 2 :

    location /a/b {}
    
    location /a/ {}
    
    location ~ /a.* {}
    

    请求 " /a/b " 会匹配到第三个 " ~ /a.* ",因为虽然首先匹配最长前缀是 " /a/b ",但它没有 ^~ 结束正则,所以继续正则匹配,匹配到了第三个

    case 3:

    location /a/b {}
    
    location /a/ {}
    
    location ~ /b.* {}
    

    请求 " /a/b " 会匹配到第一个 " /a/b ",首先匹配最长前缀是 " /a/b ",它没有 ^~ 结束正则,所以尝试匹配第三个,但是匹配失败,所以还是返回 " /a/b "

    case 4:

    location /a/b {}
    
    location ~ /.* {}
    
    location ~ /a.* {}
    

    请求 " /a/b " 会匹配到第二个 " ~ /.* ",首先匹配最长前缀是 " /a/b “,它没有 ^~ 结束正则,所以尝试匹配正则,” ~ /.* "在上面,所以先匹配它,匹配成功结束匹配

    case 5:

    location /a/b {}
    
    location ~ /c.* {}
    
    location ~ /d.* {}
    

    请求 " /a/b " 会匹配到第一个 " /a/b ",首先匹配最长前缀是 " /a/b “,它没有 ^~ 结束正则,所以尝试匹配正则,先匹配 " ~ /c.* " 匹配失败,再匹配” ~ /d.* " 依然失败,所以结果还是 " /a/b "

    case 6:

    location ^~ /a {}
    
    location ~ /a.* {}
    

    请求 " /a/b " 会匹配到第一个 " ^~ /a/ ",因为匹配最长前缀是 " /a ",它前面有 ^~ 结束了正则匹配

    case 7:

    location ^~ /a/b {}
    
    location ~ /a.* {}
    
    location = /a/b {}
    

    请求 " /a/b " 会匹配到第三个 " = /a/b ",因为匹配到了最长的 " /a/b ",它前面有 = 结束了整个匹配

    总结就是:完全匹配 > ^~ 最长前缀 > 正则 > 最长前缀

    另外,官方文档说的

    image-20210829112729313

    在 0.7.1 到 0.8.41 的版本中,如果请求匹配没有“ =”和“ ^~”修饰符的前缀位置,搜索也会终止并且不检查正则表达式。

    2、http_core_module 中用的两个文件访问指令, root 和 alias

    1、root :服务器实际访问路径为 root路径 + location路径
    location /a {
    	root /b/; 
    }
    # requestURI: /a/index.html    =>     匹配服务器文件: /b/a/index.html
    

    eg:

    location /html {
    	root /usr/local/nginx/;
    }
    # 请求:  http://${domain}/html/a.html => 匹配服务器文件: /usr/local/nginx/html/a.html
    # 请求:  http://${domain}/html/www/a.html => 匹配服务器文件: /usr/local/nginx/html/www/a.html
    
    2、alias :服务器实际访问路径为 alias路径 + 去掉location路径后的请求路径
    location /a/ {
    alias /b/;  
    }
    # requestURI: /a/index.html    =>     匹配服务器文件: /b/index.html
    

    eg:

    location /html {
    	alias /usr/local/nginx/;
    }
    # 请求:  http://${domain}/html/a.html => 匹配服务器文件: /usr/local/nginx/a.html
    # 请求:  http://${domain}/html/www/a.html => 匹配服务器文件: /usr/local/nginx/www/a.html
    
    #====================== 分割线 =======================================
    
    location /html/www {
    	alias /usr/local/nginx;
    }
    # 请求:  http://${domain}/html/www/a.html => 匹配服务器文件: /usr/local/nginx/a.html
    
    3、正则取参数
    location ~ ^/user/(.+\.(?:gif|jpe?g|png))$ {
      alias /usr/local/nginx/$1;
    }
    # 请求:  http://${domain}/user/a.jpg   =>  匹配服务器文件: /usr/local/nginx/a.jpg
    
    #====================== 分割线 =======================================
    
    location ~ ^/user/(.+\.(?:gif|jpe?g|png))$ {
      root /usr/local/nginx/$1; #这种没啥实际作用
    }
    # 请求:  http://${domain}/user/a.jpg => 匹配服务器文件: /usr/local/nginx/a.jpg/user/a.jpg
    
    4、官方文档说
    # 当 location 匹配指令值的最后一部分时:
    # 如下这种情况下:   http://xxx/images/a.jpg     =>     /data/w3/images/a.jpg
    location /images/ {
     alias /data/w3/images/;
    }
    
    # 最好是换成下面这种写法
    
    location /images/ {
     root /data/w3;
    }
    

    3、http_rewrite_module 中的 break、if、return、rewrite、set

    用一个案例介绍这几个指令的用法,我取名为: 动态路径转发

    如下代码,我想发起左边的请求,通过nginx后实际请求右边的请求

    请求 http://xxx/server/8000/list  经过nginx =>   实际请求  http://xxx:8000/list
    请求 http://xxx/server/9000/one   经过nginx =>   实际请求  http://xxx:9000/one
    请求 http://xxx/server/${port}/${param}   经过nginx =>  实际请求  http://xxx:${port}/${param}
    

    那就可以这样加一个location 取出端口和参数,在nginx中重定向到 http://xxx: p o r t / port/ port/param;

    location /server/ {
    	set $port ""; 
    	set $param ""; 
    	if ($uri ~ "^/server/(.*)/(.*)$") {	
    		set $port $1; 
    		set $param $2; 
         	 rewrite ^/(.*)   http://xxx:$port/$param break; 
             # 也可以用 proxy_pass 加 break; 如下
             # proxy_pass   http://139.9.137.157:$port/$param;
             # break; (这里的break不能像rewrite里的一样放屁股上)
    	}
        return 400; 
    }
    

    简单介绍一下这个配置的意思

    • 例如,请求的URL 为 http://xxx/server/9000/one

    • 1、定义两个变量 port 和 param 都为空串

    • 2、如果请求的uri 匹配 这样的正则,取出两个参数,第一个参数为 9000,第二个参数为 one

    • 3、将参数1 (9000) 赋值给变量 port , 将参数2 (one) 赋值给变量 param

    • 4、重定向整个路径到http://xxx: p o r t / port/ port/param 也就是( http://xxx:9000/one),break表示停止处理当前指令集,也就是不再进行后续的匹配等操作

    • 5、如果上面的if 条件不满足,就返回 400 状态码

    location /server/ {
    	set $port ""; # 定义变量 port
    	set $param ""; # 定义变量 param  都为空串
    	if ($uri ~ "^/server/(.*)/(.*)$") {	# 如果请求的uri 匹配 这样的正则,取出两个参数
    		set $port $1; # 将参数1,赋值给port
    		set $param $2; # 将参数2,赋值给param
         	rewrite ^/(.*)   http://xxx:$port/$param break; # 重定向整个路径到http://localhost:$port/$param,break表示停止处理当前指令集,也就是不再进行后续的匹配等操作
    	}
        return 400; # 如果uri没有匹配上上面的正则,返回400 状态码
    }
    

    第二个案例演示一下文件访问

    假如我的 nginx.conf 中 已经有了如下的location

    location /html {
    	root /usr/local/nginx/;
    }
    

    按照root指令的规则,访问 http://xxxxxx/html/a.html 实际就能访问到 /usr/local/nginx/html/a.html。

    现在要求:

    访问: https://xxxxxx/html/page1 能访问到 /usr/local/nginx/html/1.html

    访问: https://xxxxxx/html/page2 能访问到 /usr/local/nginx/html/2.html

    访问: https://xxxxxx/html/pagen 能访问到 /usr/local/nginx/html/n.html

    那就可以这样再加一个location解决,获取uri中的参数,然后组装,转发到原来的location

    # 原来的
    location /html {
    	root /usr/local/nginx/;
    }
    
    # 新加一个
    location /html/page {
    	rewrite ^/html/page(.*)$ /html/$1.html last;  # 获取page后面的数字n,然后转到 /html/n.html,last表示停止处理当前的指令集 并开始搜索与更改的 URI 匹配的新位置
    }
    

    简单介绍一下这个配置的意思

    • 例如,请求的URL 为 https://xxx/html/pagea (注意: /html 和 /html/page 都会匹配上这个请求, 但是 /html/page 比 /html 长,所以会使用下面这个loocation
    • rewrite ^/html/page(.*)$ /html/$1.html : 意思是将page后面的 a 提取出来,然后转到 (不是重定向) /html/$1.html ,也就是 /html/a.html
    • last表示停止处理当前的指令集 并开始搜索与更改的 URI 匹配的新位置,也就是重新去匹配 /html/a.html,当然就匹配到了原来的/html

    4、http_proxy_module 中的代理设置指令, proxy_pass

    proxy_pass 应该也是最常用的指令之一了

    还是用几个案例介绍一下用法

    1、proxy_pass 中有 uri 的情况,location 中的部分将被替换
    location /a/ {
        proxy_pass http://xxx/b/;
    }
    # 请求  http://xxx/a/list     将代理到=>    http://xxx/b/list
    

    eg:

    location /name/ {
        proxy_pass http://127.0.0.1/remote/;
    }
    # 请求  http://xxx/name/list     将代理到=>   http://127.0.0.1/remote/list      
    
    2、proxy_pass 中没有 uri 的情况,将原始的uri 拼接到 proxy_pass 中
    location /a/list {
        proxy_pass http://xxx;
    }
    # 请求  http://xxx/a/list     将代理到=>    http://xxx/a/list
    

    eg:

    location /name/list/ {
        proxy_pass http://127.0.0.1;
    }
    # 请求  http://xxx/name/list     代理到=>   http://127.0.0.1/name/list    
    
    3、获取uri上的参数,拼装到 proxy_pass
    location /name {
    	if ($uri ~ "^/name/(.*)$") {
        	proxy_pass http://127.0.0.1:9011/$1;
             break;
            }
        return 400;
    }
    # 请求  http://xxx/name/a.html     代理到=>   http://127.0.0.1:9011/a.html 
    

    其他的有时间再写。。。。

    展开全文
  • nginx location配置详细解释

    千次阅读 2021-07-23 17:57:57
    例子,有如下匹配规则: location = / { #规则A } location = /login { #规则B } location ^~ /static/ { #规则C } location ~ \.(gif|jpg|png|js|css)$ { #规则D,注意:是根据括号内的大小写进行匹配。...

    nginx的安装配置三部曲:点击即可查看

    1、安装和配置文件的基础配置,ctrl+f搜索nginx

    2、nginx文档如何查看 + 常用的配置方式(伪静态,反向代理,动静分离,防盗链,图片缓存,gzip图片压缩)

    3、高级配置-》负载均衡

    ---------------------

    server_name _; #不启用域名

    指令-热启动

    Nginx重新读取配置的命令

    nginx -s reload

    看文档的方法

    gzip压缩文件模块的使用:

    参考:nginx官方文档-》Modules reference-》ngx_http_gzip_module

    语法详解

    语法规则: location [=|~|~*|^~] /uri/ { … }

    • = 开头表示精确匹配

    • ^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)。以xx开头

    • ~ 开头表示区分大小写的正则匹配                     以xx结尾

    • ~* 开头表示不区分大小写的正则匹配                以xx结尾

    • !~!~*分别为区分大小写不匹配及不区分大小写不匹配 的正则

    • / 通用匹配,任何请求都会匹配到。

    多个location配置的情况下匹配顺序为(参考资料而来,还未实际验证,试试就知道了,不必拘泥,仅供参考):

    首先精确匹配 =-》其次以xx开头匹配^~-》然后是按文件中顺序的正则匹配-》最后是交给 / 通用匹配。

    当有匹配成功时候,停止匹配,按当前匹配规则处理请求。

    例子,有如下匹配规则:

    location = / {
       #规则A
    }
    location = /login {
       #规则B
    }
    location ^~ /static/ {
       #规则C
    }
    location ~ \.(gif|jpg|png|js|css)$ {
       #规则D,注意:是根据括号内的大小写进行匹配。括号内全是小写,只匹配小写
    }
    location ~* \.png$ {
       #规则E
    }
    location !~ \.xhtml$ {
       #规则F
    }
    location !~* \.xhtml$ {
       #规则G
    }
    location / {
       #规则H
    }

    那么产生的效果如下:

    访问根目录/, 比如http://localhost/ 将匹配规则A

    访问 http://localhost/login 将匹配规则B,http://localhost/register 则匹配规则H

    访问 http://localhost/static/a.html 将匹配规则C

    访问 http://localhost/a.gif, http://localhost/b.jpg 将匹配规则D和规则E,但是规则D顺序优先,规则E不起作用, 而 http://localhost/static/c.png 则优先匹配到 规则C

    访问 http://localhost/a.PNG 则匹配规则E, 而不会匹配规则D,因为规则E不区分大小写。

    访问 http://localhost/a.xhtml 不会匹配规则F和规则G,

    http://localhost/a.XHTML不会匹配规则G,(因为!)。规则F,规则G属于排除法,符合匹配规则也不会匹配到,所以想想看实际应用中哪里会用到。

    访问 http://localhost/category/id/1111 则最终匹配到规则H,因为以上规则都不匹配,这个时候nginx转发请求给后端应用服务器,比如FastCGI(php),tomcat(jsp),nginx作为方向代理服务器存在。

    所以实际使用中,个人觉得至少有三个匹配规则定义,如下:

     
    
    1. #直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,官网如是说。

    2. #这里是直接转发给后端应用服务器了,也可以是一个静态首页

    3. # 第一个必选规则

    4. location = / {

    5. proxy_pass http://tomcat:8080/index

    6. }

    7. # 第二个必选规则是处理静态文件请求,这是nginx作为http服务器的强项

    8. # 有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用

    9. location ^~ /static/ {                     //以xx开头

    10. root /webroot/static/;

    11. }

    12. location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ { //以xx结尾

    13. root /webroot/res/;

    14. }

    15. #第三个规则就是通用规则,用来转发动态请求到后端应用服务器

    16. #非静态文件请求就默认是动态请求,自己根据实际把握

    17. location / {

    18. proxy_pass http://tomcat:8080/

    19. }

    nginx的其他配置信息介绍

    三、ReWrite语法

    last – 基本上都用这个Flag。
    break – 中止Rewirte,不在继续匹配
    redirect – 返回临时重定向的HTTP状态302
    permanent – 返回永久重定向的HTTP状态301

    1、下面是可以用来判断的表达式:

    -f!-f用来判断是否存在文件
    -d!-d用来判断是否存在目录
    -e!-e用来判断是否存在文件或目录
    -x!-x用来判断文件是否可执行

    2、下面是可以用作判断的全局变量

    例:http://localhost:88/test1/test2/test.php

     
    
    1. $host:localhost

    2. $server_port:88

    3. $request_uri:http://localhost:88/test1/test2/test.php

    4. $document_uri:/test1/test2/test.php

    5. $document_root:D:\nginx/html

    6. $request_filename:D:\nginx/html/test1/test2/test.php

    附:一些可用的全局变量

     
    
    1. $args

    2. $content_length

    3. $content_type

    4. $document_root

    5. $document_uri

    6. $host

    7. $http_user_agent

    8. $http_cookie

    9. $limit_rate

    10. $request_body_file

    11. $request_method

    12. $remote_addr

    13. $remote_port

    14. $remote_user

    15. $request_filename

    16. $request_uri

    17. $query

    一些常用的配置

    1、普通的(静态的)http服务器

    这样如果访问http://localhost 就会默认访问到E盘wwwroot目录下面的index.html,如果一个网站只是静态页面的话,那么就可以通过这种方式来实现部署。

     
    
    1. server {

    2. listen 80;

    3. server_name localhost;

    4. client_max_body_size 1024M;

    5. location / {                

    6. root e:wwwroot;            //思路:通过/将所有的请求,转发给root处理

    7. index index.html;

    8. }

    9. }

    2、反向代理

    localhost的时候,就相当于访问localhost:8080了

    server {  
        listen       80;                                                         
        server_name  localhost;                                               
        client_max_body_size 1024M;
    
        location / {
            proxy_pass http://localhost:8080;   
            proxy_set_header Host $host:$server_port;    //思路:通过/,将所有的请求,转发给第3方处理
        }
    }

    既然服务器可以直接HTTP访问,为什么要在中间加上一个反向代理,不是多此一举吗?反向代理有什么作用?

    负载均衡、虚拟主机等,都基于反向代理实现,当然反向代理的功能也不仅仅是这些。

    3、Redirect(重定向)语法

     
    
    1. server {

    2. listen 80;

    3. server_name start.igrow.cn;

    4. index index.html index.php;

    5. root html;

    6. if ($http_host !~ "^star\.igrow\.cn$" {

    7. rewrite ^(.*) http://star.igrow.cn$1 redirect;

    8. }

    9. }

    4、防盗链

    location ~* \.(gif|jpg|png|bmp)$ {
        valid_referers none blocked *.ttlsa.com server_names ~\.google\. ~\.baidu\.;
        if ($invalid_referer) {
            return 403;
            #rewrite ^/ http://www.ttlsa.com/403.jpg;
        }
    }

    5、根据文件类型设置过期时间

     
    
    1. location ~* \.(js|css|jpg|jpeg|gif|png|swf)$ {

    2. if (-f $request_filename) { //只能是文件,因为这用-f判断了

    3. expires 1h;

    4. break;

    5. }

    6. }

    6、设置图片缓存(过期)时间

    7、禁止访问某个目录

     
    
    1. location ~* \.(txt|doc)${

    2. root /data/www/wwwroot/linuxtone/test; #所有用户都禁止访问这个目录

    3. deny all;

    4. }

    8、隐藏版本号的作用

    通过你所用的版本,找其漏洞,进行攻击你

    在http中添加该配置:server_tokens off;

    9、配置https

    1、去阿里云/腾讯云申请免费的

    2、下载证书

    3、证书放到/usr/local/nginx目录下(就是和conf同级,nginx.conf默认的配置文件的上一级)

    4、在vhost目录下加入配置文件

    server {
     listen 443;
     server_name lampol.edu0532.cn; #改域名
     ssl on;
     root /home/www/xcxtp5/public; #改项目路径
     ssl_certificate ../certbo/1523694051089.pem;    #改证书路径
     ssl_certificate_key ../certbo/1523694051089.key; #改私钥路径
     ssl_session_timeout 5m;
     ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
     ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
     ssl_prefer_server_ciphers on;
            location / {
                index  index.html index.htm index.php;
                autoindex  on;
                # 伪静态配置  
                if (!-e $request_filename) {
                    rewrite  ^(.*)$  /index.php?s=$1  last;
                    break;
                }
            }
    
            location ~ \.php$ {
                fastcgi_pass   127.0.0.1:9000;
                fastcgi_index  index.php;
                include        fastcgi.conf;
            }
    
    }
    

    10、动静分离

    思路:动、静态的文件,请求时匹配不同的目录

    当访问gif,jpeg时 直接访问e:wwwroot;,正则自行配置

    server {  
      listen       80;  
      server_name  localhost;  
    
      location / {  
          root   e:wwwroot;  
          index  index.html;  
      }  
    
      # 所有静态请求都由nginx处理,存放目录为html  
      location ~ .(gif|jpg|jpeg|png|bmp|swf|css|js)$ {  
          root    e:wwwroot;  
      }  
    
      # 所有动态请求都转发给tomcat处理  
      location ~ .(jsp|do)$ {  
          proxy_pass  http://test;  
      }  
    
      error_page   500 502 503 504  /50x.html;  
      location = /50x.html {  
          root   e:wwwroot;  
      }  
    }  

    负载均衡

    参考:nginx官方文档-》Modules reference-》ngx_http_upstream_module

    请点击参考我这篇博客

    展开全文
  • Nginx 重写功能(location / rewrite)

    千次阅读 2021-11-14 20:41:30
    一、Nginx常见模块 ... ...作用包括:文件引入、MIME-Type定义、日志自定义、是否使用sendfile传输文件、连接超时时间、单连接请求数上限等。 ... server块,虚拟主机(虚拟服务器)。... location块是ser
  • Nginx location的使用

    千次阅读 2019-04-28 19:05:23
    这里我们小结下“普通 location”与“正则 location ”的匹配规则:先匹配普通 location ,再匹配正则 location ,但是如果普通 location 的匹配结果恰好是“严格精确( exact match )”的,则 nginx 不再尝试后面...
  • 本文目录 一、常用规则 二、实际使用建议 三、Flag标志位 四、If 判断指令 五、全局变量 ...作为一名Java开发人员,有些东西不经常使用,很容易忘记,好比nginx...location = / { # 精确匹配 / ,主机名后面不能.
  • nginx 配置指令之location使用

    千次阅读 2022-05-22 14:48:40
    nginx 配置指令之location使用
  • Nginx的rewrite重写跳转和location匹配

    万次阅读 2021-11-15 19:35:35
    目录 常用的Nginx 正则表达式 location大致可以分为三类 location 常用的匹配规制 location优先级 location示例说明 实际网站使用中,至少有三个匹配规则定义: 第一个必选规则 第二个必选规则是处理静态文件请求,...
  • js中location对象详解

    千次阅读 2022-03-16 16:09:03
    location 是最有用的 BOM 对象之一,提供了当前窗口中加载文档的信息,以及通常的导航功能。主要是对浏览器url地址相关数据的获取和定义。 1. location常用属性 location.href: 返回当前页面的完整的URL地址; ...
  • nginx之location规则及地址重写

    千次阅读 多人点赞 2020-08-18 19:37:37
    location规则及rewrite重写
  • location的语法

    千次阅读 2021-11-14 22:18:20
    本篇主要讲解nginx中的location的语法。 location的作用 location主要用于URI的匹配。 其中URI(统一资源标识符)、URN() URI:Uniform Resource Identifier,统一资源标识符;如下图的data.html; URN:Uniform ...
  • alias 假如我们不想让每个 location 都继承 root,而是拥有自己的 root,那么 location 内的 root 与 alias 指令就是很好的选择。 6.1 准备工作 目录结构 home cookcyq web d 1.html 内容为 Hello, 1....
  • Nginx的location路径匹配规则

    万次阅读 2021-12-16 11:42:29
    Nginx的location路径匹配规则1、 语法2、 语法说明3、匹配规则(先后顺序)4、测试示例5、【uri】正则路径5、路径替换 1、 语法 [ = |~ | ~* | ^~ | @ ] /uri/ 注:uri是指匹配路径, [ =| ~ | ~* | ^~ | @ ] 是指...
  • ndk location和download都是灰的点不了,不去配置这个会影响我之后的操作吗 <p><img alt="" height="530" src="https://img-ask.csdnimg.cn/upload/1620696485236.png" width="950" /></p> <p><img alt="" ...
  • Linux学习-nginx学习之location

    千次阅读 2022-04-18 07:27:01
    Nignix之location学习 简介 用户请求时发出请求后,服务器会先进行域名匹配(server_name),然后再进行URI匹配,URI中没有使用正则表达式,nginx会先在server中的多个location选取匹配度最高的一个URI,URI是用户请求...
  • Nginx之location详解

    万次阅读 2020-06-17 17:53:56
    location中root指定的只是相对路径,需要和路径结合起来映射地址,比如 location ^~/static/ { ## 这里的root需要和路径结合使用,即是映射的文件位置为 /usr/alyingboy/static root /usr/alyingboy/; index ...
  • Location 指令介绍

    千次阅读 2021-01-15 21:38:50
    location:用来设定不同URI 的文件系统的路径映射,一个server中可以设置多个location,Nginx会根据用户请求的URI 地址来逐个判断location, 找出最佳匹配规则,然后应用该location中定义的配置。 语法规则: ...
  • nginx里location ~小问题

    千次阅读 2022-04-22 16:29:28
    nginx里location ~小问题 错误写法: 为了偷懒,在nginx.conf文件中,直接复制修改location地址,没有及时地删除废弃的location地址,出现了无法调用服务的情况。 错误代码如下: server { listen 9001; ...
  • LocationProvider是位置源的意思,用于提供定位信息。 常用的LocationProvider主要有三种: GPS:通过手机里面的GPS芯片,来利用卫星定位信息的。 network:通过网络来获取位置信息的,主要利用手机的基站,和WiFi...
  • nginx location / 区别

    千次阅读 2021-11-05 17:55:15
    1.location和proxy_pass都带/,则真实地址不带location匹配目录 location /api/ { proxy_pass http://127.0.0.1:8080/; } 访问地址:www.test.com/api/upload-->http://127.0.0.1:8080/upload 2....
  • 前置文章: Linux(CentOS7) 下 Nginx1.15.8 安装步骤 ...用 Nginx 可以很好地帮我们实现路由功能,我们所有需要做的就是配置好 location 模块。 目录 语法规则 匹配规则 proxy_pass 代理转发 root 与 inde...
  • nginx中location的优先级别

    千次阅读 2022-03-10 16:40:53
    nginx中location的优先级别
  • 的确有如下权限 那么我们接下来就要申请这个权限,我这里用的Rxpermissios申请的 val rxPermissions = RxPermissions(this) rxPermissions.request( Manifest.permission.ACCESS_FINE_LOCATION ).subscribe { a...
  • Nginx location匹配规则及优先级

    千次阅读 2020-12-23 21:45:48
    location匹配规则及优先级 1.语法规则 2.匹配优先级 3.配置示例
  • nginx location指令用法

    千次阅读 2022-04-17 08:37:28
    nginx使用location指令去匹配不同的路径 nginx首先通过路径的前缀去匹配 此时用法就是如下: # url就是路径的前缀,比如/, 比如/aaa location url {...} location / { config1 } location /aaa { config2 } ...
  • location.href和window.open的几种用法

    千次阅读 2019-05-30 17:35:20
    一、location.href常见的几种形式 self.location.href;//当前页面打开URL页面 window.location.href;//当前页面打开URL页面 this.location.href;//当前页面打开URL页面 location.href;// 当前页面打开URL页面 ...
  • 【Nginx实战】location匹配规则详解

    千次阅读 2020-08-28 14:47:39
    在Nginx配置中,location指令是最核心的一项配置,根据预先定义的URL匹配规则来接收用户发送的请求,根据匹配结果,将请求转发到后台服务器、非法的请求直接拒绝并返回403、404、500错误处理等。 1、location匹配...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,439,007
精华内容 575,602
关键字:

location