十分钟,我们一起搞定nginx配置location带不带/

21,468 阅读1分钟

前言

nginx的知识点有很多

  • server : 用于定义服务,http中可以有多个server块
  • listen : 指定服务器侦听请求的IP地址和端口
  • server_name : 服务名称,用于配置域名
  • location : 用于配置映射路径uri对应的配置
  • root : 根路径
  • index : 设置首页
  • return:返回http状态码 和 可选的第二个参数可以是重定向的URL
  • rewrite:重写URI请求 rewrite,通过使用rewrite指令在请求处理期间多次修改请求URI
  • error_page:缺省页
  • deny:禁止访问某个目录
  • 内置变量:nginx的配置文件中可以使用的内置变量以美元符$开始,也有人叫全局变量
  • 当然远远不止以上几点...

我们今天着重讨论location

nginx.conf配置:location不带/

首先,通过nginx.conf的设置,我们在8080端口开启了一个服务,以下的一些配置项我简单介绍一下

  1. location映射路径,一个server中可以有多个location, location后面跟一个uri,可以是一个正则表达式, / 表示匹配任意路径, 当客户端访问的路径满足这个uri时就会执行location块里面的代码
  2. alias虚拟目录,alias指定的目录是准确的,即location匹配访问的path目录下的文件直接是在alias目录下查找的,我设置成我电脑目录的一个文件夹
  3. index首页,我设置成这个alias里的index.html
server {
        listen       8080;
        server_name  localhost;
        add_header Cache-Control: no-cache;

        location /homepage {
            alias "/usr/local/Cellar/nginx/1.19.7/html/html/";
            index index.html;
        }

        error_page  404              /404.html;

        error_page   500 502 503 504  /404.html;

        location = /404.html {
            root   html;
        }
    }

静态资源目录配置

以下是上述alias指定的/usr/local/Cellar/nginx/1.19.7/html/html目录结构

.
├── html      # 放置html文件的文件夹
├── scripts   # 放置js文件的文件夹
├── styles    # 放置css文件的文件夹
├── 404.html  # 404专用html文件

image.png

在终端中开启nginx

nginx

可以看到8080端口正常开启了服务

image.png

访问URL

首先,我们访问的URL为http://localhost:8080/homepage/

从下图可以看到,我们的请求为200,说明nginx成功找到了该文件并返回给客户端

image.png

接着,我们访问的URL为http://localhost:8080/homepage

从下图中可以看到,我们的请求被301了,301的地址可以从响应头的Location里得知,被301到了http://localhost:8080/homepage/,然后该请求则跟上文一致200并返回html

image.png

nginx.conf配置:location带/

我们现在修改location

server {
        listen       8080;
        server_name  localhost;
        add_header Cache-Control: no-cache;

-       location /homepage {
+       location /homepage/ {
            alias "/usr/local/Cellar/nginx/1.19.7/html/html/";
            index index.html;
            expires off;
        }

        error_page  404              /404.html;

        error_page   500 502 503 504  /404.html;

        location = /404.html {
            root   html;
        }
    }

修改完成后,让nginx重启,应用新的配置

nginx -s reload

接着访问URL

首先,我们访问的URL为http://localhost:8080/homepage

在下图中,我们可以看到请求404了

image.png

接着,我们访问的URL为http://localhost:8080/homepage/

在下图中,我们可以看到,与未加/对比,并没有什么不同

image.png

location URI结尾带不带 /

关于 URI 尾部的 / 有三点也需要说明一下。第一点与 location 配置有关,其他两点无关。

  1. location 中的字符有没有 / 都没有影响。也就是说 /homepage/ 和 /homepage 是一样的。
  2. 如果 URI 结构是 https://domain.com/ 的形式,尾部有没有 / 都不会造成重定向。因为浏览器在发起请求的时候,默认加上了 / 。虽然很多浏览器在地址栏里也不会显示 / 。
  3. 如果 URI 的结构是 https://domain.com/homepage/ 。尾部如果缺少 / 将导致重定向。因为根据约定,URL 尾部的 / 表示目录,没有 / 表示文件。所以访问 /homepage/ 时,服务器会自动去该目录下找对应的默认文件。如果访问 /homepage 的话,服务器会先去找 homepage 文件,找不到的话会将 homepage 当成目录,重定向到 /homepage/ ,去该目录下找默认文件。

location优先级

location的优先级与location配置的位置无关

  1. 正则匹配 location ~ /index { }
  2. 不区分大小写的正则匹配 location ~* /index { }
  3. 匹配路径的前缀,如果找到停止搜索 location ^~ /index { }
  4. 精确匹配 location = /index { }
  5. 普通路径前缀匹配 location /index { }
  6. 优先级: 4 > 3 > 2 > 1 > 5
location = / {
    # 精确匹配/,主机名后面不能带任何字符串 /
    [ configuration A ]
}
location / {
    # 匹配所有以 / 开头的请求。
    # 但是如果有更长的同类型的表达式,则选择更长的表达式。
    # 如果有正则表达式可以匹配,则优先匹配正则表达式。
    [ configuration B ]
}
location /documents/ {
    # 匹配所有以 /documents/ 开头的请求,匹配符合以后,还要继续往下搜索。
    # 但是如果有更长的同类型的表达式,则选择更长的表达式。
    # 如果有正则表达式可以匹配,则优先匹配正则表达式。
    [ configuration C ]
}
location ^~ /images/ {
    # 匹配所有以 /images/ 开头的表达式,如果匹配成功,则停止匹配查找,停止搜索。
    # 所以,即便有符合的正则表达式location,也不会被使用
    [ configuration D ]
}

location ~* \.(gif|jpg|jpeg)$ {
    # 匹配所有以 gif jpg jpeg结尾的请求。
    # 但是 以 /images/开头的请求,将使用 Configuration D,D具有更高的优先级
    [ configuration E ]
}

location /images/ {
    # 字符匹配到 /images/,还会继续往下搜索
    [ configuration F ]
}

location = /test.htm {
    root   /usr/local/var/www/htm;
    index  index.htm;
}