如何使用Nginx修复http重定向?

时间:2017-01-02 19:30:38

标签: nginx http-redirect

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

目前的行为是:

www.example.com,example.com,http://www.example.comhttp://example.comhttps://www.example.com全部重定向到https://www.example.com

https://example.com收到错误提示拒绝连接。

我希望行为像这样:

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

www.example.com,http://www.example.comhttps://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

2 个答案:

答案 0 :(得分:3)

您有两个独立的问题:

  1. 您的请求全部重定向到example.com,无论最初访问哪个特定域。
  2. 这是因为您使用的$server_name变量实际上是给定server上下文中的静态变量,并且与$http_host的关系非常遥远。

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

    1. 您在尝试与https://example.com联系时遇到连接问题,但未https://www.example.com
    2. 您的问题中没有足够的信息来确定此问题的确切来源。

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

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

      • 您的证书是否涵盖example.comwww.example.com?如果没有,那么你就不能同时拥有这两者。

      • 如果您有单独的证书,您可能还需要获取单独的IP地址,否则可能会因为缺少SNI而无法阻止大量用户访问您的网站。

      值得注意的是,还应该指出的是,对于访问网站的方式没有统一的表示法通常是草率的做法。特别是如果您对SEO有任何顾虑,最好的做法是决定是否要与www一起使用,并坚持使用。

答案 1 :(得分:1)

你需要这样的东西:

class Car{
  private final int maxSpeedInMph = 100;
  private int speedInMph = 0;
  public void accellerateBy(int speedDiffInMph){
    if( maxSpeedInMph >=speedInMph + speedDiffInMph )
       speedInMph += speedDiffInMph;
    else 
       speedInMph = maxSpeedInMph ;
  }    
  public void accellerateTo(int newSpeedInMph){
    if( maxSpeedInMph >=  newSpeedInMph)
       speedInMph = newSpeedInMph;
    else 
       speedInMph = maxSpeedInMph ;
  }
  public void decellerateBy(int speedDiffInMph){
    if( 0<=speedInMph - speedDiffInMph )
       speedInMph += speedDiffInMph;
    else 
       speedInMph = 0;
  }
  public void emengencyBreak(){
    speedInMph = 0;
  }
  // you get the idea?
}

您的所有请求都将最终发送至https://example.com。 您的ssl证书也应该对https://www.example.com有效,我注意到您说的是。{/ p>