nginx服务器configuration:子域到文件夹

我从Apache 2迁移到nginx,我有问题来处理我的子域控制。 我想要什么:当请求x.domain.tld时, 内部重写为domain.tld / x

我得到的问题是nginx总是通过告诉浏览器redirect到页面来redirect页面。 但是我真正想要的是在内部做这个,就像Apache 2一样。 此外,如果我只请求x.domain.tld,nginx返回一个404。它只适用于当我做x.domain.tld / index.php

这是我的configuration:

server { listen 80 default; server_name _ domain.tld www.domain.tld ~^(?<sub>.+)\.domain\.tld$; root /home/domain/docs/; if ($sub) { rewrite (.*) /$sub; } # HIDDEN FILES AND FOLDERS rewrite ^(.*)\/\.(.*)$ @404 break; location = @404 { return 404; } # PHP location ~ ^(.*)\.php$ { if (!-f $request_filename) { return 404; } include /etc/nginx/fastcgi_params; fastcgi_pass unix:/etc/nginx/sockets/domain.socket; } } 

谢谢!

当我在Google上发现这个问题时,同时寻找同样问题的解决方案,我想发布我最终使用的解决方案。


由MTeck的第一个服务器块看起来相当不错,但是对于子域部分,您可以简单地执行以下操作:

 server { listen 80; server_name "~^(?<sub>.+)\.domain\.tld$"; root /path/to/document/root/$sub; location / { try_files $uri $uri/ /index.php; } location ~ \.php { include fastcgi_params; fastcgi_pass unix:/etc/nginx/sockets/domain.socket; } } 

这使root配置指令依赖于子域。

我花了好几个小时的时间把我的头靠在墙上,这对我来说是有用的

 server { listen 80; server_name ~^(?P<sub>.+)\.example\.com$; #<-- Note P before sub, it was critical for my nginx root /var/www/$sub; #<-- most important line cause it defines $document_root for SCRIPT_FILENAME location / { index index.php index.html; #<-- try_files didn't work as well } location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; #<-- probably you have another option here eg fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name; include fastcgi_params; } } 

你应该看看http://wiki.nginx.org/IfIsEvil 。 你在这个配置文件中做了很多错误。

 server { server_name domain.tld www.domain.tld; location / { try_files $uri /index.php; } location ~ \.php { include fastcgi_params; fastcgi_pass unix:/etc/nginx/sockets/domain.socket; } } server { server_name "~^(?<sub>.+)*\.(?<domain>.*)$"; return 301 $scheme://$domain/$sub$request_uri; } 

如果你想要保持这种内在的,你将无法重写它。 根据定义,需要将跨站点重写发送回浏览器。 你必须代理请求。

 server { server_name "~^(?<sub>.+)*\.(?<domain>.*)$"; proxy_pass http://$domain/$sub$request_uri; } 

你应该阅读Nginx wiki。 所有这些都是深入的解释。

这也适用于www。

 server { listen 80 default_server; listen [::]:80 default_server; index index.php index.html index.htm index.nginx-debian.html; server_name ~^www\.(?P<sub>.+)\.domain\.com$ ~^(?P<sub>.+)\.domain\.com$; root /var/www/html/$sub; location / { try_files $uri $uri/ /index.php?$args; } }