Назад | Перейти на главную страницу

nginx: [Emerg] директива «location» (/ «server») здесь не разрешена

Я попытался создать 2 отдельных файла конфигурации NGINX для двух доменов. У каждого домена есть тест. субдомен и www будут постоянно перенаправлены на now-www по каноническим причинам. Как правильно это делать? Я также получаю сообщение об ошибке в приведенном ниже коде.

sudo nginx -T 
nginx: [emerg] "location" directive is not allowed here in /etc/nginx/sites-enabled/example.com:33

Вот мой файл conf для example.com, второй файл для example2 практически идентичен.

server {
listen 80;
listen [::]:80;
root /var/www/example.com/html;
index index.php index.html index.htm index.nginx-debian.html;
server_name example.com 123.456.7.8;

#(For WordPress permalinks)
try_files $uri $uri/ /index.php$is_args$args;
}

# Redirect all traffic to www to non-www for SEO canonical reasons
server {
listen 80;
listen [::]:80;
server_name www.example.com;
location / {
return 301 https://www.example.com/$request_uri;
}
}
# Direct all traffic to the subdomain to a separate folder
server {
listen 80;
listen [::]:80;
root /var/www/test/example.com/html;
index index.php index.html index.htm index.nginx-debian.html;
server_name test.example.com;

#(For WordPress permalinks)
try_files $uri $uri/ /index.php$is_args$args;
}

# include /etc/nginx/naxsi.rules
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.4-fpm.sock;
}
location = /favicon.ico { log_not_found off; access_log off;
}
location = /robots.txt { log_not_found off; access_log off; allow all;
}
location ~* \.(css|gif|ico|jpeg|jpg|js|png)$
{
expires max;

#To enable leverage browser caching log_not_found off;
}

У вас есть синтаксические ошибки в вашей конфигурации

... что должно быть ясно с обоими полученными вами сообщениями об ошибках.

Если бы вы использовали отступ в своей конфигурации, проблема стала бы очевидной и легко заметной:

  • В server{} раздел, начинающийся в строке 13, не имеет окончания }.
  • Также, если вы просто добавили } в строке 20 location{} разделы в строках 33-48 станут бесхозными.

Оригинальная конфигурация с отступом

Вы получили это сообщение об ошибке, указывающее на проблему в строке 22.

nginx: [emerg] "server" directive is not allowed here in 
/etc/nginx/sites-enabled/example.com:22

Это не решение, а только демонстрация того, как интерпретируется текущая конфигурация:

01: server {
02:     listen 80;
03:     listen [::]:80;
04:     root /var/www/example.com/html;
05:     index index.php index.html index.htm index.nginx-debian.html;
06:     server_name example.com 123.456.7.8;
07:
08:     #(For WordPress permalinks)
09:     try_files $uri $uri/ /index.php$is_args$args;
10: }
11: 
12: # Redirect all traffic to www to non-www for SEO canonical reasons
13: server {
14:     listen 80;
15:     listen [::]:80;
16:     server_name www.example.com;
17:     location / {
18:         return 301 https://www.example.com/$request_uri;
19:     }
20: 
21:     # Direct all traffic to the subdomain to a separate folder
22:     server {
23:         listen 80;
24:         listen [::]:80;
25:         root /var/www/test/example.com/html;
26:         index index.php index.html index.htm index.nginx-debian.html;
27:         server_name test.example.com;
28: 
29:         #(For WordPress permalinks)
30:         try_files $uri $uri/ /index.php$is_args$args;
31:     }
32: 
33:     # include /etc/nginx/naxsi.rules
34:     location ~ \.php$ {
35:         include snippets/fastcgi-php.conf;
36:         fastcgi_pass unix:/run/php/php7.4-fpm.sock;
37:     }
38:     location = /favicon.ico { 
39:         log_not_found off; access_log off;
40:     }
41:     location = /robots.txt { 
42:         log_not_found off; access_log off; allow all;
43:     }
44:     location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ {
45:         expires max;
46: 
47:         #To enable leverage browser caching log_not_found off;
48:     }

Ваша первая попытка исправить это

... добавив } (строка 20) не помогла, потому что не учла мой второй совет!

nginx: [emerg] "location" directive is not allowed here in 
/etc/nginx/sites-enabled/example.com:33

Теперь у вас все еще есть сирота location{} директивы, здесь, в строках 34-47:

13: server {
14:     listen 80;
15:     listen [::]:80;
16:     server_name www.example.com;
17:     location / {
18:         return 301 https://www.example.com/$request_uri;
19:     }
20: }
21: # Direct all traffic to the subdomain to a separate folder
22: server {
23:     listen 80;
24:     listen [::]:80;
25:     root /var/www/test/example.com/html;
26:     index index.php index.html index.htm index.nginx-debian.html;
27:     server_name test.example.com;
28: 
29:     #(For WordPress permalinks)
30:     try_files $uri $uri/ /index.php$is_args$args;
31: }
32: 
33: # include /etc/nginx/naxsi.rules
34: location ~ \.php$ {
35:     include snippets/fastcgi-php.conf;
36:     fastcgi_pass unix:/run/php/php7.4-fpm.sock;
37: }
38: location = /favicon.ico { 
39:     log_not_found off; access_log off;
40: }
41: location = /robots.txt { 
42:     log_not_found off; access_log off; allow all;
43: }
44: location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ {
45:     expires max;
46:     #To enable leverage browser caching log_not_found off;
47: }

Решение состоит в том, чтобы поставить эти location{} разделы внутри один из server{} разделы. Никто здесь не может сказать, какой из них подходит для них, потому что вы не объясняете это в своем вопросе: они совершенно не связаны с вашим вопросом об обработке двух доменов в отдельных файлах.


Наконец, четкая конфигурация шаблона

Этот пример конфигурации пытается ответить на ваш вопрос, как он указан в заголовке. Это для /etc/nginx/sites-enabled/example.com а другой может быть /etc/nginx/sites-enabled/example.net, если заменить все example.com с участием example.net.

server {
    listen 80;
    server_name example.com www.example.com test.example.com; 

    # HTTP to HTTPS redirections for all the subdomains
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name www.example.com;
    # ssl_* directives here

    # www to non-www for SEO canonical reasons
    return 301 https://example.com$request_uri;
}

server {
    listen 443 ssl;
    server_name example.com;
    # ssl_* directives here

    root /var/www/example.com/html;
}

server {
    listen 443 ssl;
    server_name test.example.com;
    # ssl_* directives here

    root /var/www/example.com/test;
}

Просто добавьте сюда location{} разделы по мере необходимости. Я также удалил дополнительные listen директивы для IPv6, index директивы и т. д., поскольку они могли ослепить вас. Как только вы удалите весь шум, решение довольно простое, не так ли. Затем вы можете настроить все остальное.

Итак, с моими местоположениями, добавленными внутри серверных блоков, я думаю, это, наконец, будет выглядеть так, как показано ниже (без SLL на данный момент, поскольку я добавлю, что позже с Certbot и Certbot все равно автоматически изменит мой код).

server {
    listen 80;
    server_name www.example.com;

    # www to non-www for SEO canonical reasons
    return 301 http://example.com$request_uri;
}

server {
    listen 80;
    server_name example.com;

    root /var/www/example.com/html;
    index index.php index.html index.htm index.nginx-debian.html;

    # PHP
    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.4-fpm.sock;
    }
    location = /favicon.ico {
        log_not_found off; access_log off;
    }
    location = /robots.txt {
        log_not_found off; access_log off; allow all;
    }
    location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ {
        expires max;
    }

    # (For WordPress permalinks)
    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }
}

server {
    listen 80;
    server_name test.example.com;

    root /var/www/example.com/test;
    index index.php index.html index.htm index.nginx-debian.html;

    # PHP
    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.4-fpm.sock;
    }
    location = /favicon.ico {
        log_not_found off; access_log off;
    }
    location = /robots.txt {
        log_not_found off; access_log off; allow all;
    }
    location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ {
        expires max;
    }

    # (For WordPress permalinks)
    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }
}