Конфигурация сервера nginx: поддомен в папку - PullRequest
16 голосов
/ 10 февраля 2012

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

Проблема, с которой я столкнулся, заключается в том, что 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;
        }
}

Спасибо!

Ответы [ 4 ]

8 голосов
/ 20 мая 2013

Когда я нашел эти вопросы и ответы в 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 зависимой от субдомена.

3 голосов
/ 18 октября 2016

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

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;
    }
}
1 голос
/ 08 марта 2012

Вы должны взглянуть на 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 голосов
/ 01 февраля 2017

Это будет работать и для 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;
    }
}
...