Как предотвратить перенаправления на nginx, когда домен в заголовке хоста не совпадает с доменом в URL запроса? - PullRequest
0 голосов
/ 18 марта 2020

У меня на домашнем сервере запущен nginx по адресу keepsecret.ddns. net. Когда я запрашиваю, например, keepsecret.ddns.net/foo/, он возвращает мне keepsecret.ddns.net/foo/index.html. Пока все хорошо.

Теперь я пытаюсь рассматривать мой домашний сервер как вышестоящий сервер. Перед этим вышестоящим сервером находится удаленный прокси-сервер на www.mydomain.com.. Когда я запрашиваю, например, www.mydomain.com/foo/index.html, он возвращается ко мне без проблем. Тем не менее, когда я запрашиваю www.mydomain.com/foo/, nginx сначала выполняет перенаправление 301, чтобы я затем был отправлен на keepsecret.ddns.net/foo/, показывая мой домашний IP-адрес: (

Я понятия не имею, почему nginx ведет себя так. Единственное, что я предполагаю, это то, что он связан с тем фактом, что домен в заголовке узла запроса не совпадает с доменом в URL-адресе запроса.

Вкратце вопросы:

  • Почему nginx делает это?
  • Как я могу запретить nginx выполнять это перенаправление, чтобы я всегда оставался на www.mydomain.com?

Вот основная часть моего конфига для справки:


server {
    listen 80 default_server;
    listen [::]:80 default_server;

    root /var/www/html;

    index index.html index.htm index.nginx-debian.html;

    server_name _;

    location / {
        try_files $uri $uri/ =404;
    }
}


server {

    root /var/www/html;

    index index.html index.htm index.nginx-debian.html;
    server_name keepsecret.ddns.net www.mydomain.com;

    location / {
        try_files $uri $uri/ =404;
    }

        listen [::]:443 ssl ipv6only=on; # managed by Certbot
        listen 443 ssl; # managed by Certbot
        ssl_certificate /etc/letsencrypt/live/keepsecret.ddns.net/fullchain.pem; # managed by Certbot
        ssl_certificate_key /etc/letsencrypt/live/keepsecret.ddns.net/privkey.pem; # managed by Certbot
        include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}

server {
    if ($host = keepsecret.ddns.net) {
            return 301 https://$host$request_uri;
        }
    if ($host = www.mydomain.com) {
            return 301 https://$host$request_uri;
        }

    listen 80 ;
    listen [::]:80 ;

        server_name keepsecret.ddns.net www.mydomain.com;
        return 404; # managed by Certbot
}

1 Ответ

0 голосов
/ 20 марта 2020

NGINX будет выполнять внутреннее перенаправление на файл индекса. html во всех случаях, но, похоже, он будет выведен, когда имя_сервера не соответствует первичному имени_сервера. Я подозреваю, что изменение порядка server_name так, чтобы ваше publi c (проксируемое) имя было первым, может избавиться от этого поведения.

Альтернативой было бы сосредоточиться на обратном прокси и взглянуть на proxy_redirect. чтобы сделать перезапись заголовков местоположения обратным прокси для вас.

См .: http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_redirect

...