【问题标题】:Negative lookbehind in nginx location blocknginx 位置块中的负后视
【发布时间】:2017-10-25 04:23:48
【问题描述】:

我需要在 nginx 中创建一个虚拟子目录,它将从不同于根目录的位置提供文件。此虚拟目录也运行 PHP,但为简洁起见,我省略了 fastcgi 配置。

我有两个位置块,一个 /virtual 目录使用别名,而 / 的位置块有它自己的根指令。这个根指令被虚拟文件夹继承,弄乱了路径。有什么办法可以排除 /virtual 中的 url 继承 / location 块的根指令?

这是我的服务器配置的摘录:

server {
    root /path/to;

    location ^~ /virtual/ {
        alias /path/to/lions/public;
        try_files $uri $uri/ /lions/public/index.php?$query_string;
    }

    location / {
        root /path/to/tigers/public;
        try_files $uri $uri/ /index.php?$query_string;
    }
}

如果我浏览到 hostname/virtual/whatever,nginx 会在

处查找文件
/path/to/tigers/public/lions/public/whatever

而不是

/path/to/lions/public/whatever

我尝试了以下模式来匹配 / 处的所有 URL,但以 /virtual 开头的 URL 除外,但这不匹配任何内容。

location ^~ ((?!\/virtual)\/.*)$

我也尝试在 /virtual 的位置块中同时放置别名和根指令,但 nginx 无法启动。

还有其他方法可以为我的别名目录设置不同的根目录吗?

【问题讨论】:

  • 试试this approach。使用location ~ ^/?virtual/.*$ { # empty },然后使用location / { ... }

标签: regex nginx


【解决方案1】:

location 的值和alias 的值应该都以/ 结尾,或者都不以/ 结尾 - 由于nginx 在计算@987654328 时进行文本替换的方式@。

try_files 语句中的所有元素都是 URI,因此您的最终元素应该是 /virtual/index.php?$query_string 而不是 /lions/public/index.php?$query_string。后者将开始新的搜索,该搜索将由location / 块处理。因此奇怪的文件路径。

最后,将aliastry_files 一起使用时存在不可预测性。见this bug report。使用if 块可以实现相同的功能。关于if的使用见this caution

例如:

location ^~ /virtual/ {
    alias /path/to/lions/public/;
    if (!-e $request_filename) { rewrite ^ /virtual/index.php?$query_string; }
}

【讨论】:

    猜你喜欢
    • 2018-09-26
    • 1970-01-01
    • 1970-01-01
    • 2015-07-15
    • 2017-08-11
    • 2017-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多