Nginx Location Demo
环境准备
此处演示仅限本地修改
host 修改
127.0.0.1 hujiao.com
root 与 alias 的区别
两个案例
server {
listen 80;
server_name localhost;
location /blog {
alias D:/dee_code/dee-blog-code/blog/;
index index.html index.htm;
}
}
server {
listen 2323;
server_name localhost;
location / {
root D:/dee_code/dee-blog-code/public/;
index index.html index.htm;
}
}
先说结论:
当设置
root时, 访问http://hujiao.com:2323/时,会访问 root 所指向的D:/dee_code/dee-blog-code/public/+ location 所指向的/当设置
alias时,访问http://hujiao.com/blog/时,只会访问 alias 所指向的D:/dee_code/dee-blog-code/blog/
因此如果我想将上述写法互换,需要如下改动
server {
listen 80;
server_name localhost;
location /blog {
root D:/dee_code/dee-blog-code/;
index index.html index.htm;
}
}
server {
listen 2323;
server_name localhost;
location / {
alias D:/dee_code/dee-blog-code/public/;
index index.html index.htm;
}
}
举个demo
在 linux 环境下 /data/one/1.html 的资源
如果分别想通过 root 和 alias 应该怎么配置可以访问?
访问路径为 http://139.224.230.186/one/1.html
proxy_pass的映射
在这里我们只讨论一个问题
反向代理时 location 和 proxy_pass 后跟着的
/到底如何映射
项目准备
核心依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!--springboot web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--springboot test-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.17</version>
</dependency>
Controller
@RestController
@RequestMapping()
public class Start {
@RequestMapping("/**")
public Map test(HttpServletRequest request){
System.out.println("requestURI() = " + request.getRequestURI());
System.out.println("requestURL() = " + request.getRequestURL());
return MapUtil.builder(new HashMap<String, String>())
.put("requestURI", request.getRequestURI())
.put("requestURL", request.getRequestURL().toString()).build();
}
}
Nginx 配置
随便先写一种
upstream deetest {
server hujiao.com:23323;
}
server {
listen 80;
server_name localhost;
location /test/ {
proxy_pass http://deetest/;
}
}
在浏览器中访问 http://hujiao.com/test/
此时后端响应
{
"requestURL": "http://deetest/",
"requestURI": "/"
}
现在我只调整 Nginx 配置一处
upstream deetest {
server hujiao.com:23323;
}
server {
listen 80;
server_name localhost;
location /test/ {
proxy_pass http://deetest;
}
}
在浏览器中访问 http://hujiao.com/test/
此时后端响应
{
"requestURL": "http://deetest/test/",
"requestURI": "/test/"
}
探究
在这里我把它分为3类
proxy_pass尾巴有/proxy_pass尾巴没有/proxy_pass后有路径
location /api1/ {
proxy_pass http://deetest/;
}
location /api2 {
proxy_pass http://deetest/;
}
location /api3/ {
proxy_pass http://deetest;
}
location /api4 {
proxy_pass http://deetest;
}
先分别看下效果
http://hujiao.com/api1/uriXXX
{
"requestURL": "http://deetest/uriXXX",
"requestURI": "/uriXXX"
}
http://hujiao.com/api2/uriXXX
{
"requestURL": "http://deetest//uriXXX",
"requestURI": "//uriXXX"
}
http://hujiao.com/api3/uriXXX
{
"requestURL": "http://deetest/api3/uriXXX",
"requestURI": "/api3/uriXXX"
}
http://hujiao.com/api4/uriXXX
{
"requestURL": "http://deetest//uriXXX",
"requestURI": "//uriXXX"
}
结论1
proxy_pass有/
location只属于部分匹配, 不属于请求部分, 会在请求路径中删除proxy_pass无 /
location不管带不带 /, 都会将 /api 作为真实请求路径
第三种情况
location /api5/ {
proxy_pass http://deetest/route/;
}
location /api6 {
proxy_pass http://deetest/route/;
}
location /api7/ {
proxy_pass http://deetest/route;
}
location /api8 {
proxy_pass http://deetest/route;
}
效果
http://hujiao.com/api5/uriXXX
{
"requestURL": "http://deetest/route/uriXXX",
"requestURI": "/route/uriXXX"
}
http://hujiao.com/api6/uriXXX
{
"requestURL": "http://deetest/route//uriXXX",
"requestURI": "/route//uriXXX"
}
http://hujiao.com/api7/uriXXX
{
"requestURL": "http://deetest/routeuriXXX",
"requestURI": "/routeuriXXX"
}
http://hujiao.com/api8/uriXXX
{
"requestURL": "http://deetest/route/uriXXX",
"requestURI": "/route/uriXXX"
}
结论2
以第一种方式进行切割
附
第一个 demo 的一种配置
server {
listen 80;
#域名、主机名 匹配站点: 完整匹配、通配符匹配、通配符结束匹配、正则匹配
# server_name www.saddyfire.cn saddyfire.cn ;
# return 301 https://$server_name$request_uri;
server_name localhost;
location /one/ {
root /data/;
index index.html;
}
location /two/ {
alias /data/one/;
index index.html;
}
}