Вот моя 4-х, 5-часовая проблема:
Я установил многосайтовый экземпляр WordPress, который будет обрабатывать сайты на domain.com, subdomain.domain.com и customdomain.com. Будет N сайтов, использующих customdomain.com, поэтому я бы предпочел не создавать записи для каждого. На сервере у меня Nginx перед Apache.
Я бы хотел создать в Nginx запись с подстановочными знаками для обработки всех пользовательских доменов. Сейчас это выглядит примерно так:
server {
listen 80;
server_name _;
root /home/server_user/web/production;
client_max_body_size 50M;
client_body_buffer_size 128k;
location / {
access_log off;
proxy_pass http://localhost:8080;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $proxy_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
При такой настройке он будет передавать запросы в Apache и обслуживать динамический контент, но возвращает 404 для всего статического контента. Если я изменю server_name на customdomain.com, Nginx снова начнет обслуживать статический контент. Когда я меняю server_name на _ или любой другой универсальный шаблон, Nginx падает лицом вниз.
Любые идеи?
Решение (по крайней мере, с моей конфигурацией):
В вашей записи с подстановочными знаками директива listen также должна включать default:
listen 80 default;
Не добавляйте директиву server_name, потому что это приведет к некрасивым и неожиданным сбоям в работе.
Реквизит для Макс Катлер за то, что помог мне разобраться в этом.
Ссылаясь на официальная документация, у вас есть следующие возможности:
server {
server_name example.com *.example.com www.example.*;
}
server {
server_name _ *;
}
server {
server_name example.com *;
}
Обратите внимание, что это было изменено в 0.6.x и теперь:
server {
server_name _;
}
Начиная с nginx 0.7.12, поддерживается пустое имя сервера, чтобы перехватывать запросы без заголовка Host:
server {
server_name "";
}