Я использую 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]
Причина здесь - первое 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)?