Nginx: перенаправить как http, так и https root в подкаталог
Я пытаюсь перенаправить корневой домен для http и https в nginx в один и тот же подкаталог (https):
Так, например,
http://example.com -> https://example.com/subdirectory
https://example.com -> https://example.com/subdirectory
Как бы мне это ни казалось простым, я изо всех сил пытаюсь этого добиться. Я пытался использовать варианты переписывания и возврата 301, но всегда получал цикл перенаправления.
Мой текущий конфиг (вызывающий цикл):
server {
listen 80;
server_name example.com;
return 301 https://$server_name/subdirectory;
}
server {
listen 443 ssl spdy;
server_name example.com;
return 301 https://$server_name/subdirectory;
}
В общем, я пытаюсь перенаправить на тот же подкаталог по https от корневого домена, независимо от того, запрашивается ли корневой домен через http или https.
3 ответа
Эта конфигурация будет делать то, что вы хотите:
server {
listen 80:
server_name example.com;
return 301 https://$server_name/subdirectory;
}
server {
listen 443;
server_name example.com;
location = / {
return 301 https://$server_name/subdirectory;
}
}
= /
спецификаторы означают полное совпадение, поэтому оно соответствует только точному корневому URI виртуального сервера.
server {
listen 80:
server_name example.com;
return 301 https://$server_name/subdirectory/;
}
server {
listen 443;
server_name example.com;
location = / {
return 301 https://$server_name/subdirectory/;
}
}
Посмотрите, как я добавил косую черту в конце, это очень важно, иначе вы получите петли перенаправления.
Очевидно, что это не сработает, если вы не исключите подкаталог location из этого поведения для ssl vhost.
server {
listen 80;
server_name example.com;
return 301 https://$server_name/subdirectory;
}
server {
listen 443 ssl spdy;
server_name example.com;
location /subdirectory {
# Your stuff
}
location = / {
return 301 https://$server_name/subdirectory;
}
}
Другой подход с некоторыми "хитростями"...
server {
access_log /var/log/nginx/<DOMAIN_NAME>-access.log;
error_log /var/log/nginx/<DOMAIN_NAME>-error.log;
listen <PORT_PROXY>;
server_name <DOMAIN_NAME>;
location /<SUBDIRECTORY> {
proxy_pass http://<RESOURCE_IP>:<RESOURCE_PORT>/<SUBDIRECTORY>;
proxy_redirect off;
proxy_set_header Host $host:<PORT_PROXY>;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
}
location = / {
return 301 https://$server_name/<SUBDIRECTORY>;
}
}
Благодаря! =D