我需要在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不会启动。
还有其他方法可以为别名目录设置不同的根目录吗?
答案 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