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

Posted

技术标签:

【中文标题】如何将任何包含点的路径与 nginx 匹配?【英文标题】:How can I match any path containing a dot with nginx? 【发布时间】:2019-10-13 06:05:14 【问题描述】:

我正在尝试使用 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 资源未找到”

有什么办法让它工作吗? 我找不到任何解决方案

【问题讨论】:

【参考方案1】:

在 URI 中匹配 任何点 可以这样做:

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

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

~* 告诉 nginx 进行不区分大小写的正则表达式匹配(~ 区分大小写) \. 匹配文字点符号 . .*这里的点等于除空格以外的任何符号,星号修改前面的符号以“尽可能多地匹配” $ 匹配行尾

如果你想匹配像log.in这样的“格式错误”的uri,你可以使用这个正则表达式

编辑:在您的情况下,您必须将此正则表达式放在您的 location ~* /static/* 所以它不会将uris 与/static/image.png 之类的点匹配。解释见注释。

注意事项

请注意,此位置块将匹配传递的 URI 中的任何位置。所以它也会匹配像/a.ssets/images//assets/favicon.ico 这样的 URI。任何非终止位置(没有^~= 的位置)将不会被使用,即使它们应该匹配,如果点正则表达式匹配并且它是第一个匹配的正则表达式位置 它优先于其他任何东西。

来自nginx's docs 的关于匹配位置偏好的重要sn-p:

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

【讨论】:

只是一个关于区分大小写的注释,虽然知道区别很有用,但在这种特殊情况下,它是无关紧要的,因为我们将大写和小写都与点匹配。* 如果你想匹配两个点,例如“/hello/../xyz”,您必须使用 if 而不是位置。见***.com/a/52294234/5099059

以上是关于如何将任何包含点的路径与 nginx 匹配?的主要内容,如果未能解决你的问题,请参考以下文章

Nginx 路径匹配规则

什么是正确的 nginx 位置规则以仅将 URI 中的第一个路径元素与 CGI 可执行文件匹配?

Nginx配置转发

nginx中路径的匹配问题

nginx的优先匹配规则

正则表达式将文件夹名称与Productivity Power Tools颜色编码匹配