我正在尝试使用基本的 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;
}
Nginx 配置不是一个程序,它是一个声明。当您使用这样的配置时:
无法确保您的
set
指令会在 之前执行root
。但是
map
我喜欢使用指令的一个技巧。map
它依赖于之前评估的事实location
为什么不直接使用:
除了DukeLion 的出色回答外,我还需要换行
~^(.?<mypath>+)\.frameworks\.loc$ $mypath;
至
~^(?P<mypath>.+)\.frameworks\.loc$ $mypath;
按照此处的建议在我的
/etc/nginx/nginx.conf
文件中。添加
root /var/www/frameworks/$rootpath
在
/etc/nginx/sites-available/default
那之后工作得很好。也许你也可以看看 lighttpd。它内置了对您在这里所要求的内容的支持。它是调用mod_evhost。
启用虚拟主机
将以下行添加到您的 lighttpd.conf 中。如果您使用的是 Debian/Ubuntu 基础发行版,只需软链接或从复制
/etc/lighttpd/conf-available/10-evhost.conf
到/etc/lighttpd/conf-enabled/
.evhost.path-patten 中的
%_
(通配符)表示使用完整的域名(例如 www.example.com)。对 www.example.com 的请求将自动定向到 document-root/home/www/www.example.com/
。/home/www
添加其他站点就像在完整域名下创建另一个目录一样简单。没有更改 Lighttpd 配置文件。还有其他通配符,可用于构建目录结构。它们如下
详细信息在这里。
PS:如果你在 debian/ubuntu 平台上,启用 PHP 也很容易。只需启用
10-fastcgi.conf
和15-fastcgi-php.conf
。NGINX 使用 PCRE 正则表达式库。
从 NGINX v0.8.25 开始,
server_name
指令允许命名捕获。我使用以下代码片段来“隔离”开发人员环境。«user» 指的是他们的用户名,«proj» 指的是他们从事的项目:
请注意,nginx 配置是声明性的,因此,与运行时计算值和变量相比,静态声明可能总是更快。正则表达式评估成本相对较高,我想它必须在重负载(生产)环境中与简约一起使用。