【问题标题】:Nginx dynamic location path configurationNginx动态定位路径配置
【发布时间】:2017-04-25 05:25:33
【问题描述】:

首先我想说我对 nginx 比较陌生,我基本上只知道我上周学到的东西。

也就是说,我目前有一个标准配置的 Nginx 服务器:

server {
  listen 80;
  server_name site.com;

  root /var/www/site.com/;
  index index.php;

  location / {
    try_files $uri $uri/ /index.php;
  }

  location /microsite/first {
    try_files $uri $uri/ /microsite/first/;
  }

  location /microsite/second {
    try_files $uri $uri/ /microsite/second/;
  }

  ...
}

这很好用,尽管对于我添加到现有站点的每个 microsite,它都需要添加一个新位置,以引用新 microsite 的路径。

我的问题是: 是否可以动态设置 location 参数,使其捕获和引用 microsite/ 目录中存在的任何子目录?

例如类似于重写规则 rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last;(取自 nginx 站点)但应用于 location 参数的内容,例如:

location ~ ^/microsite/(.*)$ {
  try_files $uri $uri/ /microsite/$1/;
}

$1 会在其中捕获(.*) 中传递的子目录名称? (我尝试了这个我参考(另一个)Nginx dynamic location configuration 问题的答案构建的 sn-p,尽管它不起作用)

另外,我不是正则表达式专家,过去我对它进行了一些调整,但那是不久前的事了,我不记得确切的术语,所以这可能是问题的一部分,也许? !

无论如何,感谢所有帮助。
提前致谢!!

【问题讨论】:

    标签: nginx nginx-location


    【解决方案1】:

    尝试以下方式:

    location ~ ^/microsite/(?<foo>.+)$ {
        try_files $uri $uri/;
        root /microsite/$foo;
    }
    

    【讨论】:

    • 也感谢您的反馈,但不幸的是它也不起作用。您共享的 location 块返回了 500 内部服务器错误。我对代码进行了一些尝试,看看我是否可以让它工作,并发现 500 是由root /path/$foo 行引起的。我还尝试将$foo 变量放在try_files $uri $uri/ /path/$foo 上(将root ... 行注释掉),它只会打开“保存文件”窗口。
    【解决方案2】:

    您可能需要将捕获限制在前两个路径段:

    location ~ ^(/microsite/[^/]+) {
        try_files $uri $uri/ $1/;
    }
    

    [^/] 字符类匹配任何不是 / 的字符

    【讨论】:

    • 感谢您的建议,但没有奏效。我尝试了location 块,就像你写的一样,但是当尝试访问该站点时,它只是打开了“保存文件”窗口(下载 index.php 文件,我们显然没有想要)。
    • 它需要放在location ~ \.php$ 块之后。请参阅 this document 了解 nginx 如何处理请求。您可能希望使用$1/index.php 使最后一个元素显式链接到index.php
    • 嘿,Richard,很抱歉缺席,但我忙于另一个项目,现在才回到这个问题。我只想感谢您的出色帮助 =) 您的建议成功了。尽管我从 nginx 文档中了解到有关location 块优先级的内容,但我虽然location 配置的路径越精确,它作为服务器规则的优先级就越高!虽然该块之前确实有~ 字符,所以.. 无论如何,我把它放在你提到的location ~ \.php$ 块之后,它工作得很好,所以再次感谢=D欢呼!!
    • 您对前缀位置的理解是正确的,但是,正则表达式位置会按顺序计算,直到找到匹配项。
    猜你喜欢
    • 2018-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-26
    • 1970-01-01
    • 1970-01-01
    • 2018-02-21
    • 2015-11-14
    相关资源
    最近更新 更多