nginx位置块中的负向lookbehind

时间:2017-05-24 17:19:08

标签: regex nginx

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

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

以下是我的服务器配置的摘录:

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

我已经尝试了以下模式来匹配所有网址/除了那些以/ virtual开头的网址,但这些网址与之不匹配。

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

我也尝试在/ virtual的位置块中添加别名和root指令,但是nginx不会启动。

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

1 个答案:

答案 0 :(得分:0)

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

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

最后,将location /alias结合使用时存在不可预测性。见this bug report。使用try_files块可以实现相同的功能。有关使用if的信息,请参阅this caution

例如:

if