NGINX将http重定向到https,将非www重定向到ww

时间:2014-01-14 06:01:10

标签: redirect ssl nginx https

我正在使用SSL设置nginx服务器。

ssl的域名是www.mydomain.com

我想重定向所有请求:

http://mydomain.comhttp://www.mydomain.com,& https://mydomain.com

https://www.mydomain.com

我目前设置了以下服务器块:

server{
  listen 443 ssl;
  root /www/mydomain.com/;

  ssl_certificate /ssl/domain.crt;
  ssl_certificate /ssl/domain.key;
  .
  . 
  .
}

server{
  listen 80;
  server_name mydomain.com;
  return 301 https://www.mydomain.com$request_uri;
}

server{
  listen 80;
  server_name www.mydomain.com;
  return 301 https://www.mydomain.com$request_uri;
}

server{
  listen ssl 443;
  server_name mydomain.com;
  return 301 https://www.mydomain.com$request_uri;
}

目前这不起作用,但我不明白为什么不行。我可以得到http - >的组合https工作或没有www到 - > www工作,但如上所述混合它们不起作用。

6 个答案:

答案 0 :(得分:17)

如果您的ssl证书不支持非www域,则ssl重定向将不起作用。 配置正确,但可以简化为1个重定向服务器

另请不要忘记重新加载nginx sudo service nginx reload

server {
  listen 80;
  listen 443 ssl;
  server_name example.com;
  # add ssl settings
  return 301 https://www.example.com$request_uri;
}

答案 1 :(得分:9)

我迟到了,但你可以这样做

server{
  listen 443 ssl;
  server_name www.mydomain.com;
  root /www/mydomain.com/;

  ssl    on;
  ssl_certificate /ssl/domain.crt;
  ssl_certificate /ssl/domain.key;
  .
  . 
  .
}

server{
  listen 80;
  server_name www.mydomain.com mydomain.com;
  return 301 https://$server_name$request_uri;
}

server{
  listen 443;
  server_name mydomain.com;
  return 301 https://www.$server_name$request_uri;
}

或者您可以将return 301 https://www.$server_name$request_uri;替换为rewrite ^ http://www.$server_name$request_uri? permanent;,两者都有效。

您还需要在谷歌网站管理员中设置此项以获得更好的搜索引擎优化。

答案 2 :(得分:0)

#If you like to redirect all "http" to "https" then add the following:
server {
        listen 80;

        server_name yourdomain.com;
        server_name www.yourdomain.com;

 if ($scheme = "http")
        {
                rewrite ^(.*)$ https://yourdomain.com$1 permanent;
        }
}

答案 3 :(得分:0)

这对我来说适用于HTTP到https重定向,

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

    root /var/www/html;
    index index.php index.html index.htm index.nginx-debian.html;
    server_name example.com;

    #For HTTP to HTTPS:

    proxy_set_header X-Forwarded-Proto $scheme;
    if ( $http_x_forwarded_proto != 'https' ) 
    {
        return 301 https://$host$request_uri;
    }

    location / {
        try_files $uri $uri/ /index.php;
        add_header 'Access-Control-Allow-Origin' '*';
    }
    
    location ~ \.php$ {
        include fastcgi.conf;   
        fastcgi_pass unix:/var/run/php/php7.3-fpm.sock;
    }

    
    location ~ /\.ht {
        deny all;
    }
}

谢谢。

答案 4 :(得分:0)

使用重写将所有 HTTP 流量发送到 HTTPS:

server {
 listen 80 default_server;
 listen [::]:80 default_server;
 server_name _;
 return 301 https://$host$request_uri;
}

此配置侦听端口 80 作为 IPv4 和 IPv6 的默认服务器,并且 对于任何主机名。 return 语句返回一个 301 永久重定向到 HTTPS 服务器在同一主机上并请求 URI。

答案 5 :(得分:0)

Please add two given things on your file.

Given code paste on top side 
server {
    listen 80;
    server_name linuxize.com www.linuxize.com;
    return 301 https://linuxize.com$request_uri;
}

Given code paste on bottom side.
server {
    listen 443 ssl http2;
    server_name www.linuxize.com;

    # . . . other code

    return 301 https://linuxize.com$request_uri;
}

了解更多click here!