Включение нескольких доменов в блоке сервера nginx
Я использую nginx для пересылки запросов на моем сервере. У меня есть два серверных блока, один для основного веб-сайта и другой серверный блок для обслуживания моего статического содержимого S3.
server {
listen 80;
server_name abc.guru www.abc.guru;
access_log off;
error_log off;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_redirect off;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
}
}
# Server for S3 This accepts anything apart from the above two
server {
# Listen on port 80 for all IPs associated with your machine
listen 80 default_server;
# Catch all other server names
server_name _;
}
Это работает для abc.guru
но если я войду www.abc.guru
не удается, т.е. выдает ошибку. Эта веб-страница имеет цикл перенаправления. Я сослался на документацию и там говорится, что мы можем добавить несколько доменов, используя пробел.
У меня есть запись DNS для www @
и @ относится к корневому IP-адресу.
Как я могу заставить его работать как для первого блока сервера, так и для любого другого домена во втором блоке сервера?
В моем файле.htaccess у меня есть
RewriteRule (.*) http://www.abc.guru/$1 [R=301,L]
RewriteRule ^http://www.abc.guru/$1 agent.guru [L]
RewriteRule ^http://www.abc.guru/$1 index.php [L]
2 ответа
Виновником здесь является первый RewriteRule в вашей конфигурации Apache. Он сообщает Apache перенаправлять каждый запрос http://www.abc-guru.com
,
Итак, когда nginx отправляет запрос http://www.abc-guru.com
, запрос направляется в Apache, и первый RewriteRule перенаправляет этот запрос в http://www.abc-guru.com
, таким образом вызывая цикл перенаправления.
Лучшее решение - это перенести перенаправления на nginx, как предложил xxdesmus.
Другой вариант - ограничить применение первого RewriteRule, только если заголовок HTTP Host abc-guru.com
с директивой RewriteCond.
Вместо того, чтобы обрабатывать ваши перенаправления в файле Apache htaccess, почему бы просто не обработать эти перенаправления непосредственно в Nginx? Переслать root -> www с редиректом 301, а затем в блок www server_name отправить это на ваш proxy_pass (Apache)?