如何解决与Nginx的http重定向?

我有一个网页,http重定向有点破碎。

目前的行为是这样的:

www.example.com,example.com,http://www.example.com,http://example.com,https://www.example.com都会被重定向到https://www.example.com

https://example.com得到一个错误,表示拒绝连接。

我想要的行为是这样的:

example.com,http://example.com,https://example.com重定向到https://example.com

www.example.com,http://www.example.com,https://www.example.com重定向到https://www.example.com

这是我的Nginx配置文件

server {
       listen 80 default_server;
       listen [::]:80 default_server;
       server_name example.com www.example.com;
       return 301 https://$server_name$request_uri;
}

server {
        add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
        listen 443 ssl http2 default_server;
        listen [::]:443 ssl http2 default_server;
        include snippets/ssl-example.com.conf;
        include snippets/ssl-params.conf;

        root /var/www/html;

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

        server_name _;

        location ~ /.well-known {
                allow all;
        }

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

原因是因为我想要这些链接工作

https://www.ssllabs.com/ssltest/analyze.html?d=example.com

https://www.ssllabs.com/ssltest/analyze.html?d=www.example.com

https://hstspreload.org/?domain=example.com

https://hstspreload.org/?domain=www.example.com


你有两个独立的问题:


  • 无论最初访问哪个特定域,您的请求都会重定向到example.com
  • 发生这种情况是因为您正在使用的$server_name变量实际上是给定server上下文中的静态变量,并且与$http_host具有非常远的关系。

    正确的方法是使用$host来代替(这基本上是$http_host和一些边角清理)。


  • 尝试联系https://example.com ,您收到连接问题,但不是https://www.example.com
  • 您的问题中没有足够的信息来查明此问题的确切来源。

    它可能是一个DNS问题( example.com A / AAAA记录设置在一个IP地址,该地址没有对https端口进行适当的绑定)。

    这可能是不匹配证书的问题:

  • 您的证书是否覆盖example.comwww.example.com ? 如果不是,那么你不能同时拥有两个。

  • 如果您有单独的证书,则可能还需要获取单独的IP地址,否则可能会由于缺乏SNI而阻止大量用户访问您的站点。


  • 值得注意的是,还应该指出的是,在访问您的网站的方式上没有统一的标记通常是草率的做法。 特别是如果搜索引擎优化是你的任何问题,最好的做法是决定你是否想要带或不带www ,并坚持下去。


    你需要这样的东西:

    server {
        listen 80 default_server;
        listen [::]:80 default_server;
        server_name example.com www.example.com;
        return 301 https://$host$request_uri;
    }
    server {
        listen 443 ssl http2 default_server;
        listen [::]:443 ssl http2 default_server;
        server_name www.example.com;
    
        include snippets/ssl-example.com.conf;
        include snippets/ssl-params.conf;
    
        add_header Strict-Transport-Security "max-age=300; includeSubdomains; preload";
    
        return 301 https://www.example.com$request_uri;
    }
    server {
        listen 443 ssl http2 default_server;
        listen [::]:443 ssl http2 default_server;
        server_name example.com;
    
        root /var/www/html;
        index index.html index.htm index.nginx-debian.html;
    
        include snippets/ssl-example.com.conf;
        include snippets/ssl-params.conf;
    
        add_header Strict-Transport-Security "max-age=300; includeSubdomains; preload";
    
        location ~ /.well-known {
            allow all;
        }
        location / {
            try_files $uri $uri/ =404;
        }
    }
    

    您的所有请求都将最终路由到https://example.com。 你的ssl证书也应该对https://www.example.com有效,我注意到你已经说过了。

    链接地址: http://www.djcxy.com/p/94713.html

    上一篇: How to fix http redirects with Nginx?

    下一篇: C++ inplace destructor compile warning