你如何有条件地在Nginx虚拟主机中包含文件?

在下面的行中,我可能有一个特定于站点的configuration文件,其中包含该站点特有的其他fastcgi_params 。 如果这个文件存在,我想加载它。

server { listen 80 default; server_name _; root /path/www/$host; # Pass PHP scripts to php-fastcgi listening on port 9000 location ~ \.php { include fastcgi_params; fastcgi_pass 127.0.0.1:9000; if (-f /path/www/$host/nginx.conf) { include /path/www/$host/nginx.conf; } } } 

但是,这不起作用,我得到的错误是:

nginx:[emerg]“include”指令在这里是不允许的…

更新

我认为,而不是分离检查,我可以让包括检查我。

 server { listen 80 default; server_name _; root /path/www/$host; # Pass PHP scripts to php-fastcgi listening on port 9000 location ~ \.php { include fastcgi_params; fastcgi_pass 127.0.0.1:9000; include /path/www/$host/*.nginx; } } 

但是,这似乎并没有工作。

include在服务器启动时执行它的操作 – 像$host这样的运行时variables不能被使用,也不能在if语境中使用,就像你发现的那样。

您需要为不同的主机分割server块。 抱歉!

那么,这是相当老,但无论如何,我find了一个解决办法。

我有一个设置与这种风格configuration的虚拟主机:

 /etc/nginx/sites-enabled/site.com.conf 

而不是检查文件是否存在(这是不可能的),我只是做:

 include /etc/nginx/sites-customizations/site.com.*.conf 

这样,我可以简单地在sites-customizations文件夹中创build一个文件,按照我的惯例,这个文件名与主configuration相同。 *工作原理与if类似,因为如果没有额外的configuration文件,它不会中断。 如果你喜欢,这也可以让你在单独的文件中添加多个额外的configuration。

我知道这是旧的,但解决scheme可能会帮助像我一样寻找答案的人。

我有一堆的redirect,我只需要包括一个特定的主机,而include不允许在if指令,我最终添加, if在文件中,我包括…

所以我有一个include /etc/nginx/conf.d/redirects和我有:

 if ($host = "www.example.com") { # Some conf or redirects for this site only. }