我正在尝试使用基本的 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
但是我喜欢使用一个关于指令的技巧。它依赖于map
在location
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 配置是声明性的,因此,静态声明可能总是比运行时计算的值和变量更快。正则表达式评估成本相对较高,我猜在重负载(生产)环境中必须谨慎使用。