Я попытался создать 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;
}
}