我如何将包含点的任何路径与nginx匹配?

问题描述 投票:6回答:1

我正在尝试使用nginx配置实现代理

想法是让http服务器托管我的网站(我的SPA)。并在我的http服务器上将一条路由指向另一个api。

这是下面的我的nginw配置文件

client_max_body_size 100M;

server {
    listen       80;
    server_name  localhost;

    root   /usr/share/nginx/html;
    index  index.html index.htm;

    location ^~ /proxyapi/ {
        proxy_read_timeout 180s;
        proxy_send_timeout 180s;
        proxy_pass http://localhost:5000/;
    }

    location ~* /static/* {
      try_files $uri =404;
      expires 1y;
      access_log off;
      add_header Cache-Control "public";
    }

    # Any route that doesn't have a file extension (e.g. /devices)
    location / {
        try_files $uri $uri/ /index.html;
    }

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

大部分时间都可以正常工作

当我打电话给http://my-nginx-host/proxyapi/search/login时,它起作用...

除非登录中没有

http://my-nginx-host/proxyapi/search/login =>运行正常

[http://my-nginx-host/proxyapi/search/log.in =>失败,显示“ 404资源未找到”]

有什么方法可以使其正常工作?我找不到任何解决方案

nginx nginx-reverse-proxy nginx-config
1个回答
1
投票

可以在URI中匹配任何点

location ~* \..*$ {
 # try_files $uri $uri/ =404;
 # ...
}

让我们把正则表达式拆开:

  • [~*告诉nginx进行不区分大小写的正则表达式匹配(~区分大小写)
  • [\.与文字点符号.]匹配>
  • [.*这里的点等于除空格之外的任何符号,星号将前面的符号修改为“尽可能匹配此符号”]
  • $匹配行尾
  • 如果您想匹配“ log.in之类的格式错误的URI”,也可以使用此正则表达式>

    编辑:在您的情况下,您将必须将此正则表达式之后

放入您的location ~* /static/*,因此它与点/static/image.png之类的点不匹配。请参阅注释以获取解释。

注意

请记住,此位置块将与传递的URI中的任意点]相匹配。因此,它也将匹配这些/a.ssets/images//assets/favicon.ico这样的URI。即使它们应该匹配,也不会使用任何非终止位置(没有^~=的位置),如果点正则表达式匹配

它是第一个匹配的正则表达式位置,它优先于任何东西其他。

nginx's docs中有关位置匹配首选项的重要摘要:

正则表达式由前面的“〜*”修饰符(用于不区分大小写的匹配)或“〜”修饰符(用于区分大小写的匹配)指定。为了找到与给定请求匹配的位置,nginx首先检查使用前缀字符串定义的位置(前缀位置)。其中,将选择并记住具有最长匹配前缀的位置。然后按照在配置文件中出现的顺序检查正则表达式。正则表达式的搜索在第一个匹配项上终止,并使用相应的配置。如果未找到与正则表达式匹配的内容,则使用前面记住的前缀位置的配置。

© www.soinside.com 2019 - 2024. All rights reserved.