Конфигурация сервера nginx: субдомен в папку
Я перешел из 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;
}
}
Спасибо!
Ответы
Ответ 1
Когда я нашел этот 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
зависимой от субдомена.
Ответ 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;
}
}
Ответ 3
Вы должны взглянуть на 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. Все это подробно объяснено.
Ответ 4
Это будет работать и для 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;
}
}