Bootstrap

Nginx中 location和proxy_pass 斜杠/ 问题

location 的斜杠问题比较好理解,不带斜杠的是模糊匹配。例如:

location /doc

  • 可以匹配 /doc/index.html,也可以匹配 /docs/index.html。

location /doc/     强烈建议使用这种

  • 只能匹配 /doc/index.html,不能匹配 /docs/index.html。

  对于 proxy_pass 的斜杠问题,得结合 location 来讲。 

匹配模式

分为两种模式:

  • 绝对匹配:调用的请求Path固定为创建时填写的API请求Path。
  • 前缀匹配:调用的请求Path将以创建时填写的API请求Path为前缀,支持接口定义多个不同Path。

    例如,请求路径为/test/AA,使用前缀匹配时,通过/test/AA/CC可以访问,但是通过/test/AACC无法访问。

说明:

使用前缀匹配时,匹配剩余的路径将透传到后端。例如,使用前缀匹配,前端请求路径定义为/test/,后端请求路径定义为/test2/,通过/test/AA/CC访问API,则后端收到的请求url为/test2/AA/CC。

(1)proxy_pass  不带URL方式  保留(端口后面没有/) 


proxy_pass后面这种 IP、端口后面没有 /,是不带 URI 的方式,nginx 会保留 location 中的路径。所以访问 http://127.0.0.1/docs/,实际上访问的是 http://127.0.0.1:8080/docs/。

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

访问  http://127.0.0.1/docs/  ----------------------------> 实际访问  http://127.0.0.1:8080/docs/

        location /jenkins/ {
                proxy_set_header host $host;
                proxy_pass http://192.168.11.128:8080;

           }

tomcat日志:
192.168.11.128 - - [04/Jun/2023:07:50:59 +0800] "GET /jenkins/index.html HTTP/1.0" 404 648 

(2)proxy_pass  带URI 的方式  替换


这种 IP、端口后面有 /,是带 URI 的方式,nginx 将会使用别名的方式来对 URL 进行替换。所以,访问 http://127.0.0.1/docs/,实际上访问的是 http://127.0.0.1:8080/,/docs/ 替换成了 /。

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

访问 http://127.0.0.1/docs/   -------------> 实际访问 http://127.0.0.1:8080/

        location /article/ {
            proxy_set_header host $host;
            proxy_pass http://192.168.11.128:8080/;
         }

后端tomcat日志:

192.168.11.128 - - [04/Jun/2023:08:08:56 +0800] "GET /index.html HTTP/1.0" 404 648 

 对带 URI 的方式进行扩展:

location /article/ {
    proxy_pass http://127.0.0.1:8080/docs/;
}

这种同样 IP、端口后面有 /,也是带 URI 的方式。所以,访问 http://127.0.0.1/article/,实际上访问的是 http://127.0.0.1:8080/docs/,/article/ 替换成了 /docs/。 

 举例如下:

        location /article/ {
            proxy_set_header host $host;
            proxy_pass http://192.168.11.128:8080/docs/;
         }

192.168.11.128 - - [04/Jun/2023:08:00:26 +0800] "GET /docs/index.html HTTP/1.0" 404 648

经常出错的也正是这种带 URI 方式的写法 !!!!!proxy_pass后面不接/


例如:

location /article/ {
    proxy_pass http://127.0.0.1:8080/docs;
}

docs后面不加斜杠/,那么在访问是的时候会和index.html在一起,访问的是docsindex.html,

所以建议所有的uri末尾后面都接上/

当访问 http://127.0.0.1/article/index.html 的时候。

本意是想访问 http://127.0.0.1:8080/docs/index.html。但是,/article/ 替换成了 /docs,所以实际访问的是 http://127.0.0.1:8080/docsindex.html。

;