2012-02-10 4 views
12

Я перенес из Apache 2 в nginx, и у меня есть проблемы с ручным управлением моим поддоменом. Что я хочу: Когда x.domain.tld запрашивается, внутренне переписан для domain.tld/хКонфигурация сервера nginx: субдомен в папку

Проблема у меня в том, что Nginx всегда перенаправляет на страницу, говоря браузер для перенаправления. Но я действительно хочу сделать это внутренне, как это делал Apache 2. Кроме того, если я только прошу x.domain.tld, Nginx возвращает 404. Он работает только тогда, когда я x.domain.tld/index.php

Вот мой конфиг:

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

Спасибо!

ответ

0

Вы должны взглянуть на 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. Все это подробно объяснено.

+0

пытается перезапустить Nginx с вашим примером вызывает ошибку 'не удалось: неопознанный символ после (<' – vladkras

+0

я должен упомянуть, что это Nginx 1.10.1 – vladkras

6

Как я нашел это Q & A на 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 конфигурации в зависимости от подобласти.

+0

это решение не работает для меня – fdrv

2

Я провел часы бить головой о стену, и это то, что работает для меня

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

Это работает для меня также?. , спасибо. Знаете ли вы, как я могу добавить поддержку для www, какое-то исключение? Сейчас, когда вы пытаетесь использовать www.mydomain.com, попробуйте использовать поддомен. – fdrv

+0

Также кажется, что он не будет работать с wordpress, поскольку wp требует/index .php? $ args – fdrv

+0

@fdrv, вы должны поместить свои собственные правила в раздел 'location/{...}', например: 'rewrite^(. *?) $ /index.php?rt=$1 last;' работает – vladkras

0

Это будет работать для 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; 
    } 
} 
Смежные вопросы