Nginx 站点重定向/回退

Nginx 站点重定向/回退

我注意到我的一台服务器上出现了奇怪的行为,我无法理解它是如何工作的,最重要的是,这种配置是否会进行重定向,因为我不确定我最终是如何进入 https 的。

我有两个子域名:

test.domain.com 

test2.domain.com 

在测试配置中,我看到 server_name 的值错误:

test server config

server {

        root /var/www/html/test/public;
        index index.html index.php index.nginx-debian.html;

        server_name test test.domain.com;

        location / {
                try_files $uri $uri/ /index.php?$query_string; # =404;
        }
    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass   127.0.0.1:9000;
    
    }

    location ~ /\.ht {
        deny all;
    }

    listen [::]:443 ssl ipv6only=on; # managed by Certbot
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/test.domain.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/test.domain.com/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 = test.domain.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


        listen 80;
        listen [::]:80;

        server_name testings test.domain.com;
    return 404; # managed by Certbot


}

现在test2具有相同的server_name逻辑

server_name: test2 test2.domain.com

**and no ssl enabled**

server {

        root /var/www/html/test2/public;
        index index.html index.php index.nginx-debian.html;

        server_name test2 test2.domain.com;

        location / {
                try_files $uri $uri/ /index.php?$query_string; # =404;
        }
    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass   127.0.0.1:9000;
    
    }

    location ~ /\.ht {
        deny all;
    }

#    listen [::]:443 ssl ipv6only=on; # managed by Certbot
#    listen 443 ssl; # managed by Certbot
#    ssl_certificate /etc/letsencrypt/live/test.domain.com/fullchain.pem; # managed by Certbot
#    ssl_certificate_key /etc/letsencrypt/live/test.domain.com/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 = test2.domain.com) {
#        return 301 https://$host$request_uri;
#    } # managed by Certbot


        listen 80;
        listen [::]:80;

        server_name test2 test2.domain.com;
#    return 404; # managed by Certbot


}

有警告说 test2 已经在使用中但仍能工作。

现在奇怪的是,当我去https://test2.domain.com它确实有效,

但是给我带来的是 test 的根而不是 test2;

而有意义的是,如果我打开http://test.domain.com

我扩展了test2的证书

certbot certonly --nginx -d "test.domain.com,test2.domain.com"

因此同一个证书应该对两者都适用。

我的问题是,当我打开时,如何指向测试的根https://test2.domain.com

答案1

没有什么奇怪的 - 你得到的就是你配置的。没有什么奇怪或神奇的。这只是 tcp 套接字使用你的配置监听的内容。即使不阅读 nginx 文档,这也是显而易见的。

您没有说是在一个主机上配置了两个服务器还是在两个不同的主机上配置了两个服务器,以及您的 IP 地址test.domain.com test2.domain.com被解析为哪些 - 这对于您的问题来说非常重要,而且并不明显。

第一个猜测是 - 你谈论的是两个具有不同 IP 的 nginx 服务器,而你只是在 DNS 配置中混淆了服务器的 IP 地址

https://test2.domain.com... 带给我的是 test 的根源,而不是 test2

test2.domain.com解析服务器的 IProot /var/www/html/test/public

如果我打开,我会被重定向到 test2 的根目录http://test.domain.com

test.domain.com解析服务器的 IProot /var/www/html/test2/public

第二个猜测-你谈论一个具有两个站点配置的 nginx 服务器,并且test.domain.com解析test2.domain.com为同一主机的 IP

  • 一个 ngninx 的“服务器块”监听 IP:443 和 IP:80 ( server_name test.domain.com)

  • 以及另一个 ngninx 的“服务器块”监听 IP:80 (server_name test2.domain.com)。

https://test2.domain.com... 带给我的是 test 的根源,而不是 test2

当你打开https://测试2.domain.com 它在您的客户端上解析为IP地址:443因为你想要HTTPS. Nginx 向您展示测试内容因为在端口 443 上只配置了test.domain.comroot /var/www/html/test/public

如果我打开,我会被重定向到 test2 的根目录http://test.domain.com

当你打开http://测试.domain.com 它在您的客户端上解析为IP:80因为你想要HTTP。Nginx 有 2server_name个 80 端口:test.domain.comtest2.domain.com应该选择test.domain.com并返回来自的内容,/var/www/html/test/public但您声明它返回test2.domain.com的内容。如果指向带有的服务器的 IP ,
则有可能- 请参阅第一个猜测。test.domain.comroot /var/www/html/test2/public

https://nginx.org/en/docs/http/request_processing.html

相关内容