AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 457196
Accepted
Xeoncross
Xeoncross
Asked: 2012-12-12 13:09:07 +0800 CST2012-12-12 13:09:07 +0800 CST 2012-12-12 13:09:07 +0800 CST

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

  • 772

我正在尝试使用基本的 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;

}
php
  • 5 5 个回答
  • 26509 Views

5 个回答

  • Voted
  1. DukeLion
    2012-12-20T22:07:28+08:002012-12-20T22:07:28+08:00

    Nginx 配置不是一个程序,它是一个声明。当您使用这样的配置时:

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

    无法确保您的set指令会在 之前执行root。

    但是map我喜欢使用指令的一个技巧。map它依赖于之前评估的事实location

    http {
      map $http_host $rootpath {
        ~^(.?<mypath>+)\.frameworks\.loc$  $mypath;
        default                            /      ;
      }
      ....
      root /var/www/frameworks/$rootpath
    }
    
    • 14
  2. Best Answer
    Michael Hampton
    2012-12-20T12:55:09+08:002012-12-20T12:55:09+08:00

    为什么不直接使用:

    server_name *.frameworks.loc;
    root /var/www/frameworks/$http_host/public;
    
    • 12
  3. zub0r
    2015-09-06T03:57:33+08:002015-09-06T03:57:33+08:00

    除了DukeLion 的出色回答外,我还需要换行

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

    至

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

    按照此处的建议在我的/etc/nginx/nginx.conf文件中。

    添加

    root /var/www/frameworks/$rootpath

    在/etc/nginx/sites-available/default那之后工作得很好。

    • 4
  4. John Siu
    2012-12-20T18:35:58+08:002012-12-20T18:35:58+08:00

    也许你也可以看看 lighttpd。它内置了对您在这里所要求的内容的支持。它是调用mod_evhost。

    启用虚拟主机

    将以下行添加到您的 lighttpd.conf 中。如果您使用的是 Debian/Ubuntu 基础发行版,只需软链接或从复制/etc/lighttpd/conf-available/10-evhost.conf到/etc/lighttpd/conf-enabled/.

        # http://redmine.lighttpd.net/wiki/1/Docs:ModEVhost
        server.modules += ( "mod_evhost" )
        evhost.path-pattern = "/home/www/%_"
    

    evhost.path-patten 中的%_(通配符)表示使用完整的域名(例如 www.example.com)。对 www.example.com 的请求将自动定向到 document-root /home/www/www.example.com/。

    /home/www添加其他站点就像在完整域名下创建另一个目录一样简单。没有更改 Lighttpd 配置文件。

    还有其他通配符,可用于构建目录结构。它们如下

        %% => % 符号
        %0 => 域名 + 顶级域名
        %1 => 顶级域名
        %2 => 没有 tld 的域名
        %3 => 子域 1 名称
        %4 => 子域 2 名称
        %_ => 完整域名
    

    详细信息在这里。

    PS:如果你在 debian/ubuntu 平台上,启用 PHP 也很容易。只需启用10-fastcgi.conf和15-fastcgi-php.conf。

    • 0
  5. Stphane
    2016-12-13T03:09:08+08:002016-12-13T03:09:08+08:00

    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 配置是声明性的,因此,与运行时计算值和变量相比,静态声明可能总是更快。正则表达式评估成本相对较高,我想它必须在重负载(生产)环境中与简约一起使用。

    • 0

相关问题

  • 用户特定的 Php.ini 当 php 作为模块运行时?

  • 使 php mail() 函数在 ubuntu-server 上工作的步骤是什么?

  • Web 服务器和数据库服务器位于完全不同的位置

  • PHP 作为 CGI 还是 Apache 模块?

  • 通过 VPN 连接什么是远程服务器 IP?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve