server_name

  • 当出现多个 location 时,server_name 就有用了
  • 注意域名即使配置了 www 跳转,server_name 还是要进行 server_name 配置
    • 不然,可能会无法访问/被rewrite到其他 location 中

优先级

相同 server_name 的虚拟主机(server)优先级

  • 看加载 nginx.conf 以及子配置谁先加载(一般看文件顺序)

url 匹配优先级

  • [=|~|*|^~]`
  • 上下文 server location | 匹配规则 | 含义 | | —- | —- | | = | 普通字符精确匹配 | | ~ | 正则匹配,区分大小写 | | ~* | 正则匹配,不区分大小写 | | ^~ | 普通字符前缀匹配 | | 不带符号 | |

  • 优先级,从高到低

    • =
    • ^~
    • ~
    • ~*
    • 不带符号

      <uri> 末尾带斜 / 的区别

      • 不带: 默认会查找 uri 同名目录下的 index.html,找不到会找同名文件
      • 带: 默认会查找 uri 同名目录下的 index.html

root 和 alias 区别

alias 是一个目录别名的定义,root 则是最上层目录的定义。

例子

root:

  1. location /static/ {
  2. root ./dist/;
  3. }

如果一个请求的URI是 /static/a.js时,将会返回服务器上的 /dist/static/a.js的文件

alias实例:

  1. location /static/ {
  2. alias ./dist/;
  3. }

如果一个请求的URI是 /static/a.js时,将会返回服务器上的 /dist/a.js的文件,会直接alias 后面的值替换 location 的值

注意点

  1. 使用 alias 时,目录名后面一定要加 "/"
    3. alias 在使用正则匹配时,必须捕捉要匹配的内容并在指定的内容处使用。
    4. alias 只能位于 location 块中。(root 可以不放在 location 中)

如何获得真实 ip

问题

  • 直接用 $remote_addr 变量,如果前面经过代理ip,那么只会获得代理层的 ip
  • x_referer_for header 头,容易被篡改

解决

  • 第一层代理 进行 set x_real_ip = $remote_addr 设置一个自定义 header 头,直接获取 remote_addr
  • 其他代理层 透传 即可