Перенаправление не-www на www через SSL с помощью Nginx

У меня возникла ошибка при попытке перенаправить https://example.com на https://www.example.com .

Когда я перехожу на https://example.com , он не перенаправляет и возвращает статус страницы /200.

Я не хочу этого, я хочу, чтобы он перенаправлялся на https://www.example.com .

Когда я перейду к http://example.com , он перенаправляется на

21 голос | спросил Thomas V. 29 AM00000030000004731 2014, 03:11:47

5 ответов


31

Вам не хватает директивы listen в файле default-ssl.conf

server {
    server_name example.com;
    return 301 https://www.example.com$request_uri;
}

По умолчанию, если вы опускаете эту директиву, nginx предполагает, что вы хотите прослушивать порт 80. Здесь документации этого поведения по умолчанию.


Изменить: Спасибо за комментарий от @TeroKilkanen.

Здесь полная конфигурация для вашего default-ssl.conf

server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate /srv/www/example.com/keys/ssl.crt;
    ssl_certificate_key /srv/www/example.com/keys/www.example.com.key;
    return 301 https://www.example.com$request_uri;
}

Sidenote . Вы можете заменить директиву ssl on; с помощью listen 443 ssl; в качестве рекомендации документации по nginx .

ответил masegaloeh 29 AM00000030000000531 2014, 03:31:05
3

То, как я это делаю, - использовать оператор if внутри блока сервера ssl, который перенаправляет на https www

ssl_certificate /srv/www/example.com/keys/ssl.crt;
ssl_certificate_key /srv/www/example.com/keys/www.example.com.key;
ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers AES128-SHA:RC4-MD5:ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:RSA+3DES:!ADH:!AECDH:!MD5:AES128-SHA;
ssl_prefer_server_ciphers on;
client_max_body_size 20M;

upstream app_server_ssl {
    server unix:/tmp/unicorn.sock fail_timeout=0;
}

server {
    server_name example.com;
    return 301 https://www.example.com$request_uri
}

server {
    listen 443 default_server ssl;
    server_name www.example.com;

    # redirect https://example.com to https://www.example.com
    # mainly for SEO purposes etc
    #we will use a variable to do that
    set $redirect_var 0;

    if ($host = 'example.com') {
      set $redirect_var 1;
    }
    if ($host = 'www.example.com') {
      set $redirect_var 1;
    }

    if ($redirect_var = 1) {
      return 301 https://www.example.com$request_uri;
    } 

    try_files $uri/index.html $uri.html $uri @app;

    # CVE-2013-2028 http://mailman.nginx.org/pipermail/nginx-announce/2013/000112.html
    if ($http_transfer_encoding ~* chunked) {
            return 444;
        }

    location @app {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_pass http://app_server_ssl;
    }

    error_page 500 502 503 504 /500.html;

    location = /500.html {
        root /home/app/example/current/public;
    }
}

Конечно, всякий раз, когда вы хотите использовать оператор if в файле конфигурации nginx; вы должны были бы прочитать: https://www.nginx.com/ресурсы /вики /начало /темы /глубина /ifisevil /

ответил Komu 14 J000000Thursday16 2016, 14:29:34
3

Просто введите оператор if, и вы должны быть на вашем пути. Я проверил результаты в curl.exe -I и во всех случаях, кроме https://www.example.com получить обрабатывается как 301. SSL является сложным, потому что он проверяется, прежде чем вы получите 301 перенаправление URL-адресов. Следовательно, вы получаете ошибки сертификата.

Лично мне нравится удалять www из домена, но я написал свой код ниже, чтобы ответить на ваш вопрос.

server {
listen 443 ssl;
listen [::]:443 ssl; # IPV6

server_name example.com www.example.com; # List all variations here

# If the domain is https://example.com, lets fix it!

if ($host = 'example.com') {
  return 301 https://www.example.com$request_uri;
}

# If the domain is https://www.example.com, it's OK! No changes necessary!

... # SSL .pem stuff
...
}

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

# If the domain is http://example.com or https://www.example.com, let's change it to https!

server_name example.com www.example.com;
return 310 https://www.example.com$request_uri;
}
ответил Brian Lee 21 Jam1000000amSat, 21 Jan 2017 08:15:03 +030017 2017, 08:15:03
0

В 2018 году, и я решил, что это будет обновленный снимок, если кто-то ищет простое решение.

Я считаю, что это относительно новый подход - сделать все как можно проще. В основном вы хотите перенаправить как http://example.com , так и https://example.com - https : // www .example.com. И вам удастся перенаправить http://example.com

Это довольно простая операция, требующая только двух блоков сервера (я покажу это кратко в одном файле конфигурации)

# 1. Server block to redirect all non-www and/or non-https to https://www
server {
    # listen to the standard http port 80
    listen 80; 

    # Now, since you want to route https://example.com to http://www.example.com....
    # you need to get this block to listen on https port 443 as well
    # alternative to defining 'ssl on' is to put it with listen 443
    listen 443 ssl; 

    # define server_name
    server_name example.com *.example.com; 

    # DO NOT (!) forget your ssl certificate and key
    ssl_certificate PATH_TO_YOUR_CRT_FILE;
    ssl_certificate_key PATH_TO_YOUR_KEY_FILE; 

    # permanent redirect
    return 301 https://www.example.com$request_uri;  
    # hard coded example.com for legibility 
}
# end of server block 1. nearly there....

# 2. Server block for the www (primary) domain
# note that this is the block that will ultimately deliver content
server {
    # define your server name
    server_name www.example.com; 

    # this block only cares about https port 443
    listen 443 ssl;

    # DO NOT (!) forget your ssl certificate and key
    ssl_certificate PATH_TO_YOUR_CRT_FILE;
    ssl_certificate_key PATH_TO_YOUR_KEY_FILE; 

    # define your logging .. access , error , and the usual 

    # and of course define your config that actually points to your service
    # i.e. location / { include proxy_params; proxy_pass PATH_TO_SOME_SOCKET; }
}
# End of block 2.
# voilà! 

Теперь http://example.com и https://example.com следует перенаправить на https: //www.example .com . В основном эта настройка перенаправляет все не-www и /или не-https на https: //www .

ответил aaronlhe 25 FebruaryEurope/MoscowbSun, 25 Feb 2018 11:15:35 +0300000000amSun, 25 Feb 2018 11:15:35 +030018 2018, 11:15:35
-1

Чтобы перенаправить все запросы на https://www.example

создать серверный блок для перенаправления и первичного домена на вашем порту SSL (обычно 443), а также порт http по умолчанию 80

# non-www to ssl www redirect
server {
  listen 80; 
  listen 443 ssl;
  server_name example.com;
  return 301 https://www.example.com$request_uri;
  # ... ssl certs
}

# ssl setup for www (primary) domain
server {
  listen 80;
  listen 443 ssl;
  server_name www.example.com;
  if ($scheme = http) {
    return 301 https://www.example.com$request_uri;
  }
  # ... the rest of your config + ssl certs
}

сохранить и следовать с помощью sudo nginx -s reload

Это перенаправит

http://example      301 -> https://www.example
https://example     301 -> https://www.example
http://www.example  301 -> https://www.example
https://www.example 200
ответил lfender6445 25 52016vEurope/Moscow11bEurope/MoscowFri, 25 Nov 2016 23:20:17 +0300 2016, 23:20:17

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132