2015-06-08 33 views
-1

我有一个在Apache上运行的Web应用程序,其中虚拟主机文件配置为将请求路由到子域到特定文件夹。而不是每次创建一个子域的时间来修改host文件,这使我动态路由的URL相关的文件夹(用包罗万象如果文件夹不存在) -将Apache VirtualHost转换为动态子域的nginx服务器块

<VirtualHost *:8080> 
    ServerName localhost.com 
    ServerAlias *.localhost.com 
    VirtualDocumentRoot "/var/www/clients/%1" 
    ErrorLog "logs\errors.log" 
    <directory "/var/www/clients/%1"> 
     Options Indexes FollowSymLinks 
     AllowOverride all 
     Order Deny,Allow 
     Deny from all 
     Allow from all 
    </directory> 
</VirtualHost> 

我想将上述内容转换为nginx,但无法找到从URL中提取子域的正确逻辑,然后在配置文件中设置root变量。

如果root的路径不存在,任何人都可以帮我写一个nginx的server {}块,以及一个catch-all块吗?

+0

'server {^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ root var/www/clients/$ 1; }' – JASSY

回答

1

在server_name中使用一个命名正则表达式捕获,您可以稍后参考。

server { 
    listen 8080; 
    server_name ~^(?<subdir>.*)\.localhost\.com$ ; 

    set $rootdir "/var/www/clients"; 
    if (-d "/var/www/clients/${subdir}") { set $rootdir "/var/www/clients/${subdir}"; } 
    root $rootdir; 
} 

什么你正在做的是设置默认的根目录到一个变量$rootdir然后如果$subdir的子目录覆盖掉。

+0

非常感谢。不幸的是,它不能按预期工作。在'/ var/www/clients'目录下,我有一个包含index.html的目录'client1'。我在catch-all目录下也有一个index.html。如果我导航到'http:// client1.localhost.com',nginx正在返回catch-all页面(即直接到$ rootdir而不是$ rootdir/client1)。 – JASSY

+0

我已经切换了设置。默认现在应该工作 – pensivepie

+0

我已经改变了'server'块'{服务器 \t听8080; \t服务器名* .localhost.com; \t如果(-d“的/ var/WW /客户/ $子目录“){set $ rootdir”/ var/www/clients/$ subdir“;} \t if($ rootdir ==”“){set $ rootdir'/ var/www/clients';} \t root $ rootdir; } '但是当我尝试用'sudo service nginx restart'重新启动nginx时,它失败。 – JASSY