我无法从NGINX中的URL中获取子域名

我无法从NGINX中的URL中获取子域名。

这是我的configuration:

server { listen 80; server_name ~^(?<appname>)\.example\.com$; rewrite ^ https://$appname.example.com$request_uri? permanent; } 

当我做:

 http://bob.example.com/ 

我被发送到:

 https://.example.com/ 

我不知道我做错了什么。

我正在使用NGiNX 1.2.7。

我有另一个configuration:

 http://example.com/ 

所以我有一个服务器块的域没有子域和第二个与子域…这是关于子域。

UPDATE

这里的redirect(这是我试图提取子域的原因):

 server { listen 443 ssl; server_name ~^(?<appname>)\.example\.com$; ssl on; ssl_certificate /etc/ssl/certs/example.com.crt; ssl_certificate_key /etc/ssl/private/example.key; root /var/www/example.com/apps/$appname/; include /var/nginx/general/php; include /var/nginx/general/upload; include /var/nginx/general/error_page_50x; } 

新的更新

我得到的新错误(这是没有P):

 2013/06/30 00:49:02 [error] 7707#0: *64 directory index of "/var/www/example.com/apps//" is forbidden, client: 00.000.000.00, server: ~^(?<appname>)\.example\.com$, request: "GET / HTTP/1.1 ", host: "ebooks.example.com" 2013/06/30 00:49:02 [error] 7707#0: *64 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 00.000.000.00, server: ~^(?<appname>)\.example\.com $, request: "GET /favicon.ico HTTP/1.1", upstream: "fastcgi://unix:/var/run/php5-fpm.sock:", host: "ebooks.example.com" 2013/06/30 00:49:04 [error] 7707#0: *64 directory index of "/var/www/example.com/apps//" is forbidden, client: 00.000.000.00, server: ~^(?<appname>)\.example\.com$, request: "GET / HTTP/1.1 ", host: "ebooks.example.com" 2013/06/30 00:49:04 [error] 7707#0: *64 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 00.000.000.00, server: ~^(?<appname>)\.example\.com $, request: "GET /favicon.ico HTTP/1.1", upstream: "fastcgi://unix:/var/run/php5-fpm.sock:", host: "ebooks.example.com" 

这是与P后面的:

 2013/06/30 00:55:57 [error] 17915#0: *74 directory index of "/var/www/example.com/apps//" is forbidden, client: 00.000.000.00, server: ~^(?P<appname>)\.example\.com$, request: "GET / HTTP/1 .1", host: "drive.example.com" 2013/06/30 00:55:57 [error] 17915#0: *74 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 00.000.000.00, server: ~^(?P<appname>)\.example\.c om$, request: "GET /favicon.ico HTTP/1.1", upstream: "fastcgi://unix:/var/run/php5-fpm.sock:", host: "drive.example.com" 

你所做的只是将HTTPredirect到HTTPS,所以你根本不需要这个正则expression式。

相反,做这样的事情:

 server { listen [::]:80; server_name *.example.com; return 301 https://$http_host$request_uri$is_args$args; } 

如果您正在运行CentOS 5(或其他较旧的操作系统),则可能是由于较旧的PCRE库。 Python兼容的语法可能适用于你:

 server_name ~^(?P<appname>)\.example\.com$; 

之后的变化是P ? 。 这在PCRE 4.0或更高版本中得到支持,其中没有P的方法需要PCRE 7.0或更高版本。

这在Nginx手册的服务器名称页面的正则expression式名称下进行了解释。

我只需要添加。+ after?<subdomain>:

 server { listen 80; server_name *.example.com; return 301 https://$http_host$request_uri$is_args$args; } server { listen 443 default_server ssl; server_name ~^(?<subdomain>.+)\.example\.com$; ssl on; ssl_certificate /etc/ssl/certs/example.com.crt; ssl_certificate_key /etc/ssl/private/example.key; root /var/www/example.com/apps/$subdomain/; include /var/nginx/general/php; include /var/nginx/general/upload; include /var/nginx/general/error_page_50x; }