2012-02-10 22 views
12

He migrado de Apache 2 a nginx y tengo problemas para administrar mi control de subdominio. lo que quiero: Cuando se solicita x.domain.tld, internamente reescritura de DOMAIN.TLD/xconfiguración del servidor nginx: subdominio en la carpeta

El problema que tengo es que nginx siempre vuelve a dirigir la página diciéndole al navegador para redirigir a. Pero lo que realmente quiero es hacer esto internamente, como lo hizo Apache 2. Además, si yo sólo pido x.domain.tld, nginx devuelve un 404. Sólo funciona cuando hago x.domain.tld/index.php

Aquí está mi config:

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; 
     } 
} 

Gracias!

Respuesta

0

Deberías echar un vistazo al http://wiki.nginx.org/IfIsEvil. Estás haciendo un montón de errores en este archivo de configuración.

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; 
} 

Si lo que se desea es mantener esa interna, que no será capaz de volver a escribir. Por definición, una reescritura cruzada del sitio necesita ser enviada de vuelta al navegador. Tendrá que delegar la solicitud.

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

Debería leer la wiki de Nginx. Todo esto se explica en profundidad.

+0

tratando de reiniciar nginx con su ejemplo produce un error 'fallado: carácter no reconocido después (<' – vladkras

+0

Tengo que mencionar que era nginx 1.10.1 – vladkras

6

Como encontré esta Q & A en Google mientras buscaba una solución para el mismo problema, quería publicar la solución que finalmente utilicé.


El primer bloque del servidor en los MTeck se ve muy bonito, pero para los subdominios parte que simplemente podría hacer lo siguiente:

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; 
    } 
} 

Esto hace que la directiva de configuración root depende del subdominio.

+0

esta solución no funciona para mí – fdrv

2

pasé horas batiendo la cabeza contra la pared y esto es lo que funciona para mí

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 e.g. fastcgi_pass unix:/var/run/php5-fpm.sock; 
      fastcgi_index index.php; 
      fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name; 
      include  fastcgi_params; 
    } 
} 
+0

Funciona para mí también?. , gracias. ¿Sabes cómo puedo agregar soporte para www, alguna excepción? Ahora mismo, cuando intente utilizar www.midominio.com, intente utilizar subdominio. – fdrv

+0

También parece que no funciona con wordpress, ya que wp requiere/index .php? $ args – fdrv

+0

@fdrv tiene que poner sus propias reglas en la sección 'ubicación/{...}', por ejemplo: 'reescribir^(. *?) $ /index.php?rt=$1 last;' funciona – vladkras

0

Esto funcionará para www también.

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; 
    } 
} 
Cuestiones relacionadas