• Nginx的location作用


    server常用指令

    listen指令

    用来配置监听端口

    语法

    listen address[:port] [default_server]...;

    listen port [default_server]...;

    默认值listen *:80 | *:8000
    位置server

    listen的设置比较灵活,我们通过几个例子来把常用的设置方式熟悉下

    listen 127.0.0.1:8000; // listen localhost:8000 监听指定的IP和端口
    listen 127.0.0.1;    监听指定IP的所有端口
    listen 8000;    监听指定端口上的连接
    listen *:8000;    监听指定端口上的连接 

    default_server

    default_server属性是标识符,用来将此虚拟主机设置成默认主机。所谓的默认主机指的是如果没有匹配到对应的address:port,则会默认执行的。如果不指定默认使用的是第一个server。  

    1. server{
    2. listen 8080;
    3. server_name 127.0.0.1;
    4. location /{
    5. root html;
    6. index index.html;
    7. }
    8. }
    9. server{
    10. listen 8080 default_server;
    11. server_name localhost;
    12. default_type text/plain;
    13. return 444 'This is a error request';
    14. }

    server_name指令

    用来设置虚拟主机服务名称

    语法

    server_name name ...;

    name可以提供多个中间用空格分隔

    默认值server_name "";
    位置server

    关于server_name的配置方式有三种,分别是

    • 精确匹配
    • 通配符匹配
    • 正则表达式匹配 

    精确匹配

    1. server {
    2. listen 80;
    3. server_name www.test.cn www.test1.cn;
    4. ...
    5. }

    使用通配符配置

    1. server {
    2. listen 80;
    3. server_name *.test.cn www.test1.*;
    4. ...
    5. }

    使用正则表达式配置

    server_name中可以使用正则表达式,并且使用~作为正则表达式字符串的开始标记

    常见的正则表达式

    代码说明
    ^匹配搜索字符串开始位置
    $匹配搜索字符串结束位置
    .匹配除换行符\n之外的任何单个字符
    \转义字符,将下一个字符标记为特殊字符
    [xyz]字符集,与任意一个指定字符匹配
    [a-z]字符范围,匹配指定范围内的任何字符
    \w与以下任意字符匹配 A-Z a-z 0-9 和下划线,等效于[A-Za-z0-9_]
    \d数字字符匹配,等效于[0-9]
    {n}正好匹配n次
    {n,}至少匹配n次
    {n,m}匹配至少n次至多m次
    *零次或多次,等效于{0,}
    +一次或多次,等效于{1,}
    ?零次或一次,等效于{0,1}

    举例 

    1. server{
    2. listen 80;
    3. server_name ~^www\.(\w+)\.com$; # 以 "www." 开头,后跟一个或多个单词字符(字母、数字、下划线),然后以 ".com" 结尾的域名。其中,( ) 括号用于捕获匹配的内容,可以在后面的指令中使用。
    4. default_type text/plain; # 设置响应的 MIME 类型为 "text/plain",即纯文本类型
    5. return 200 $1 $2 ..; # 将捕获到的第一个括号内的值 $1、第二个括号内的值 $2 依次附加在返回的文本内容中。
    6. }
    7. 注意 ~后面不能加空格,括号可以取值

     由于server_name指令支持通配符和正则表达式,因此在包含多个虚拟主机的配置文件中,可能会出现一个名称被多个虚拟主机的server_name匹配成功,当遇到这种情况,当前的请求交给谁来处理呢?

    1. server{
    2. listen 80;
    3. server_name ~^www\.\w+\.com$;
    4. default_type text/plain;
    5. return 200 'regex_success';
    6. }
    7. server{
    8. listen 80;
    9. server_name www.test.*;
    10. default_type text/plain;
    11. return 200 'wildcard_after_success';
    12. }
    13. server{
    14. listen 80;
    15. server_name *.test.com;
    16. default_type text/plain;
    17. return 200 'wildcard_before_success';
    18. }
    19. server{
    20. listen 80;
    21. server_name www.test.com;
    22. default_type text/plain;
    23. return 200 'exact_success';
    24. }
    25. server{
    26. listen 80 default_server;
    27. server_name _;
    28. default_type text/plain;
    29. return 444 'default_server not found server';
    30. }

    那么他们都会去执行一遍

    1. exact_success
    2. wildcard_before_success
    3. wildcard_after_success
    4. regex_success
    5. default_server not found server!!

    location

    用来设置请求的URI

    语法location [ = | ~ | ~* | ^~ |@ ] uri{...}
    默认值
    位置server,location
    Nginx locaiton 作⽤是根据⽤户请求的 URI 不同,来执行不同的应用。针对用户请求的网站URL 进行匹配,匹配成功后进行对应的操作。
    1. location [ = | ~| ~* | ^~ ] uri {
    2. #指定对应的动作
    3. }
    uri变量是待匹配的请求字符串,可以不包含正则表达式,也可以包含正则表达式,那么nginx服务器在搜索匹配location的时候,是先使用不包含正则表达式进行匹配,找到一个匹配度最高的一个,然后在通过包含正则表达式的进行匹配,如果能匹配到直接访问,匹配不到,就使用刚才匹配度最高的那个location来处理请求。
    正则表达式解释
    匹配符
    匹配规则 
    优先级
    =
    精确匹配
    1
    ^~
    以某个字符串开头,不做正则
    2
    ~*        
    正则匹配
    3
    /blog/
    匹配常规字符串,有正则就优先正则
    4
    /
    通⽤匹配,不符合其他location的默认匹配
    5

    不带符号,要求必须以指定模式开始

    1. server {
    2. listen 80;
    3. server_name 127.0.0.1;
    4. location /abc{
    5. default_type text/plain;
    6. return 200 "access success";
    7. }
    8. }
    9. 以下访问都是正确的
    10. http://192.168.2.4/abc
    11. http://192.168.2.4/abc?p1=TOM
    12. http://192.168.2.4/abc/
    13. http://192.168.2.4/abcdef

     = : 用于不包含正则表达式的uri前,必须与指定的模式精确匹配

    1. server {
    2. listen 80;
    3. server_name 127.0.0.1;
    4. location =/abc{
    5. default_type text/plain;
    6. return 200 "access success";
    7. }
    8. }
    9. 可以匹配到
    10. http://192.168.2.4/abc
    11. http://192.168.2.4/abc?p1=TOM
    12. 匹配不到
    13. http://192.168.2.4/abc/
    14. http://192.168.2.4/abcdef

    ~ : 用于表示当前uri中包含了正则表达式,并且区分大小写

    ~*: 用于表示当前uri中包含了正则表达式,并且不区分大小写

    1. server {
    2. listen 80;
    3. server_name 127.0.0.1;
    4. location ~^/abc\w${
    5. default_type text/plain;
    6. return 200 "access success";
    7. }
    8. }
    9. server {
    10. listen 80;
    11. server_name 127.0.0.1;
    12. location ~*^/abc\w${
    13. default_type text/plain;
    14. return 200 "access success";
    15. }
    16. }

    ^~: 用于不包含正则表达式的uri前,功能和不加符号的一致,唯一不同的是,如果模式匹配,那么就停止搜索其他模式了。

    1. server {
    2. listen 80;
    3. server_name 127.0.0.1;
    4. location ^~/abc{
    5. default_type text/plain;
    6. return 200 "access success";
    7. }
    8. }

    root/alias指令

    root

    设置请求的根目录

    语法root path;
    默认值root html;
    位置http、server、location

    path为Nginx服务器接收到请求以后查找资源的根目录路径。

    alias

    用来更改location的URI

    语法alias path;
    默认值
    位置location

     path为修改后的根路径。

    以上两个指令都可以来指定访问资源的路径,那么这两者之间的区别是什么?

    举例说明 :在/usr/local/nginx/html目录下创建一个 images目录,并在目录下放入一张图片mv.png图片

    1. location /images {
    2. root /usr/local/nginx/html;
    3. }

    root的访问图片的路径为

    http://192.168.2.4/images/mv.png

    如果把root改为alias,再次访问上述地址,页面会出现404的错误

    需要在alias后面路径改为

    1. location /images {
    2. alias /usr/local/nginx/html/images;
    3. }

    小结

    root的处理结果是: root路径+location路径
    /usr/local/nginx/html/images/mv.png
    alias的处理结果是:使用alias路径替换location路径
    /usr/local/nginx/html/images

    index指令

    设置网站的默认首页

    语法index file ...;
    默认值index index.html;
    位置http、server、location

    index后面可以跟多个设置,如果访问的时候没有指定具体访问的资源,则会依次进行查找,找到第一个为止。

    1. location / {
    2. root /usr/local/nginx/html;
    3. index index.html index.htm;
    4. }
    5. 访问该location的时候,可以通过 http://ip:port/,地址后面如果不添加任何内容,则默认依次访问index.html和index.htm,找到第一个来进行返回

    error_page指令

    设置网站的错误页面

    语法error_page code ... [=[response]] uri;
    默认值
    位置http、server、location......

    当出现对应的响应code后,如何来处理。

    1.可以指定具体跳转的地址

    1. server {
    2. error_page 404 http://www.itcast.cn;
    3. }

     2.可以指定重定向地址

    1. server{
    2. error_page 404 /50x.html;
    3. error_page 500 502 503 504 /50x.html;
    4. location =/50x.html{
    5. root html;
    6. }
    7. }

    3.使用location的@符合完成错误信息展示

    1. server{
    2. error_page 404 @jump_to_error;
    3. location @jump_to_error {
    4. default_type text/plain;
    5. return 404 'Not Found Page...';
    6. }
    7. }

    实战 

    修改 nginx.conf
    1. #user nobody;
    2. worker_processes 1;
    3. #error_log logs/error.log;
    4. #error_log logs/error.log notice;
    5. #error_log logs/error.log info;
    6. #pid logs/nginx.pid;
    7. events {
    8. worker_connections 1024;
    9. }
    10. http {
    11. include mime.types;
    12. default_type application/octet-stream;
    13. #log_format main '$remote_addr - $remote_user [$time_local] "$request" '
    14. # '$status $body_bytes_sent "$http_referer" '
    15. # '"$http_user_agent" "$http_x_forwarded_for"';
    16. #access_log logs/access.log main;
    17. sendfile on;
    18. #tcp_nopush on;
    19. #keepalive_timeout 0;
    20. keepalive_timeout 65;
    21. # gzip on;
    22. server {
    23. listen 83;
    24. server_name _;
    25. #最低级匹配,不符合其他locaiton就来这
    26. location / {
    27. return 401;
    28. }
    29. #优先级最⾼
    30. location = / {
    31. return 402;
    32. }
    33. #以/blog/开头的url,来这⾥,如符合其他locaiton,则以其他优先
    34. location /blog/ {
    35. return 403;
    36. }
    37. #匹配任何以/img/开头的请求,不匹配正则
    38. location ^~ /img/ {
    39. return 404;
    40. }
    41. }
    42. }

    访问localhost:83/

    访问localhost:83/blog/

    访问localhost:83/img/

    rewrire

    Nginx rewrire技术主要是实现URL地址重写,且⽀持正则表达式的规则。 通过rewrite可以规范URL、根据变量进⾏URL跳转等,常⽤的功能如

    1. 对于爬⾍的封禁,让其跳转无用页面
    2. 动态的URL伪装成HTMl⻚⾯,便于搜索引擎的抓取
    3. 旧域名、旧⽬录的更新,需要跳转到新的URL地址

    语法

    rewrite ^/(.*) http://www.baidu.com/$1 permanent;
    rewrite是指令,开启⼀个跳转规则
    正则是 ^/(.*) 表示匹配所有,匹配成功后跳转到后⾯的url地址
    $1 表示取出前⾯正则括号⾥的内容
    permanent表示 301 重定向的标记

     参数解析

    标记
    解释
    last
    规则匹配完成后,继续向下匹配新的 Locaiton
    break
    本条规则完成匹配后,⽴即停⽌
    redirect
    返回 302 临时重定向,浏览器地址栏显示跳转后的 URL
    permanent
    返回 301 永久重定向,浏览器地址显示跳转后的 URL
    • lastbreak⽤于实现URL重写,浏览器地址栏不发⽣变化
    • redirectpermanent⽤于实现URL跳转,浏览器地址栏跳转新的URL

     访问localhost:90/

    跳转百度

  • 相关阅读:
    Vuex(十)
    XP-CLR分析学习笔记
    在定义C++, C通用接口函数时让C++接口支持默认参数
    详解QColor的使用
    访问网站提示:您未被授权查看该页恢复办法
    【开发】视频集中存储/云存储/磁盘阵列EasyCVR平台支持分组批量绑定/取消设备
    基于Python简单实现接口自动化测试(详解)
    YYDS!一行Python代码即可实现数据可视化大屏
    C++ Reference: Standard C++ Library reference: C Library: cwctype: iswalnum
    【Linux】Linux 常用命令
  • 原文地址:https://blog.csdn.net/qq_63431773/article/details/133249280