基于主机名的动态 nginx 域根路径?

基于主机名的动态 nginx 域根路径?

我正在尝试使用基本的 master/catch-all vhost 配置来设置我的开发 nginx/PHP 服务器,以便我可以创建无限___.framework.loc域名如所须。

server {
        listen 80;
        index index.html index.htm index.php;

        # Test 1
        server_name ~^(.+)\.frameworks\.loc$;
        set $file_path $1;
        root    /var/www/frameworks/$file_path/public;

        include /etc/nginx/php.conf;
}

但是,nginx 对此设置响应 404 错误。我知道 nginx 和 PHP 正在运行并且有权限,因为localhost我使用的配置运行正常。

server {
        listen 80 default;
        server_name localhost;
        root /var/www/localhost;
        index index.html index.htm index.php;

        include /etc/nginx/php.conf;
}

我应该检查什么来发现问题?这是他们都在加载的 php.conf 的副本。

location / {
        try_files $uri $uri/ /index.php$is_args$args;
}

location ~ \.php$ {

        try_files $uri =404;

        include fastcgi_params;
        fastcgi_index index.php;

        # Keep these parameters for compatibility with old PHP scripts using them.
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

        # Some default config
        fastcgi_connect_timeout        20;
        fastcgi_send_timeout          180;
        fastcgi_read_timeout          180;
        fastcgi_buffer_size          128k;
        fastcgi_buffers            4 256k;
        fastcgi_busy_buffers_size    256k;
        fastcgi_temp_file_write_size 256k;
        fastcgi_intercept_errors    on;
        fastcgi_ignore_client_abort off;
        fastcgi_pass 127.0.0.1:9000;

}

答案1

为什么不直接使用:

server_name *.frameworks.loc;
root /var/www/frameworks/$http_host/public;

答案2

Nginx 配置不是一个程序,而是一个声明。当你像这样使用配置时:

server {
        server_name ~^(.+)\.frameworks\.loc$;
        ...
        set $file_path $1;
        root    /var/www/frameworks/$file_path/public;
}

没有办法确保您的set指令在之前执行root

map但是我喜欢使用一个关于指令的技巧。它依赖于maplocation

http {
  map $http_host $rootpath {
    ~^(.?<mypath>+)\.frameworks\.loc$  $mypath;
    default                            /      ;
  }
  ....
  root /var/www/frameworks/$rootpath
}

答案3

除了出色的DukeLion's答案,我需要换线

~^(.?<mypath>+)\.frameworks\.loc$ $mypath;

~^(?P<mypath>.+)\.frameworks\.loc$ $mypath;

按照我的/etc/nginx/nginx.conf文件建议这里

添加

root /var/www/frameworks/$rootpath

/etc/nginx/sites-available/default之后工作正常。

答案4

NGINX 使用 PCRE 正则表达式库。
从 NGINX v0.8.25 开始server_name指令允许命名捕获

命名捕获在正则表达式中创建变量(0.8.25) 稍后可在其他指令中使用 在使用命名括号时,NGINX 会在服务器名称评估期间自动为每个命名括号设置一个变量(我猜)。

我使用以下代码片段来“隔离”开发人员环境。“user”指的是他们的用户名,“proj”指的是他们所从事的项目:

# ...
server_name ~^(?<user>[^.]+)\.(?<proj>[^.]+).dev.local-server.com;
root /home/$user/www/$proj;
# ...

请注意,nginx 配置是声明性的,因此,静态声明可能总是比运行时计算的值和变量更快。正则表达式评估成本相对较高,我猜在重负载(生产)环境中必须谨慎使用。

相关内容