Удалите “www” и перенаправление к “https” с nginx

Не уверенный я понимаю, как они собираются определить, сколько пользователей использует свое интернет-соединение. Однако погранично-легальное решение состояло бы в том, чтобы поместить поле NAT, плату за это, и сделать, чтобы все прошли его (возможно использование VPN). Techincally, существует только один 'компьютер', физически присоединенный к их интернет-соединению.

Если, однако, они хотят, чтобы Вы заплатили в зависимости от того, насколько люди Вы объявляете быть в офисе в любой данный день, это - полностью другой вопрос. Если бы это так, я предложил бы изменить поставщика в целом. Такая тактика говорит о чрезвычайно плохом менеджменте и незнании базовых сетей, и это взволновало бы меня, если бы я должен был полагаться на них для того, чтобы продолжить соединение и выполнить или зафиксировать его в случае проблем.

57
задан 11 April 2011 в 19:37
10 ответов

Лучший способ выполнить это использует три блока сервера: один для перенаправления http к https, один для перенаправления www-имени https к не, и одно для фактического обрабатывания запросов. Причина использования дополнительных блоков сервера вместо IFS состоит в том, что выбор сервера выполняется с помощью хеш-таблицы и очень быстр. Используя уровень сервера, если средства, если выполняется для каждого запроса, который расточителен. Кроме того, получение требуемого uri в переписывании расточительно, поскольку nginx уже имеет эту информацию в переменных $uri и $request_uri (без и со строкой запроса, соответственно).

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

server {
    listen 443 ssl;
    ssl_certificate /path/to/server.cert;
    ssl_certificate_key /path/to/server.key;
    server_name www.example.com;
    return 301 https://example.com$request_uri;
}

server {
    listen 443 ssl;
    ssl_certificate /path/to/server.cert;
    ssl_certificate_key /path/to/server.key;
    server_name example.com;

    <locations for processing requests>
}
95
ответ дан 28 November 2019 в 19:33

как насчет того, чтобы создать блок сервера с этой целью:

server{
    listen 80;
    server_name www.example.net example.net;
    rewrite ^(.*) https://example.net$1 permanent;
}

затем перезапуск nginx

0
ответ дан 28 November 2019 в 19:33

Я думаю, что это должно работать.

На Вашей плоскости определение сервера HTTP что-то как предложенный anthonysomerset, который является:

rewrite ^(.*) https://example.net$1 permanent;

Затем на Вашем определении сервера SSL:

if ($host ~ /^www\./) {
  rewrite ^(.*) https://example.net$1 permanent;
}

Таким образом, перенаправление должно только произойти однажды на запрос, неважно, в какой URL пользователь переходит первоначально.

0
ответ дан 28 November 2019 в 19:33

Я предпочитаю возвращать код ответа, чтобы браузер знал, что вы перенаправляете его на другой URL.

server {
    listen   80;
    server_name  www.example.com;

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

затем другой блок конфигурации сервера для https

server {
        listen   443 ssl;
        server_name  example.com;
        ...
    }
3
ответ дан 28 November 2019 в 19:33

Это работает для меня:

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

server {
    listen              443 ssl;
    server_name         www.yourdomain.com;
    ssl_certificate     /path/to/certificate.crt;
    ssl_certificate_key /path/to/private/key.pem;
    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
    return              301 https://yourdomain.com$request_uri;
}

server {
    listen              443 ssl;
    server_name         yourdomain.com;
    ssl_certificate     /path/to/certificate.crt;
    ssl_certificate_key /path/to/private/key.pem;
    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;

    # do the proper handling of the request
}

Имейте в виду, что оба yourdomain.com и www.yourdomain.com должны быть в вашем сертификате SSL. Это возможно с помощью подстановочного сертификата или альтернативного имени сервера, как описано здесь . Проверьте https://www.startssl.com , чтобы найти хорошие и бесплатные сертификаты, которые делают это. ( Эдит : начиная с Chrome версии 56, сертификаты startssl больше не будут доверять. Попробуйте вместо этого https://letsencrypt.org/ .)

11
ответ дан 28 November 2019 в 19:33

Проведя столько времени с сотнями похожих случаев, я придумал следующий фрагмент. Он короткий, и его можно легко настроить под что угодно.

server {
    listen 80;
    listen 443 ssl;
    server_name example.com www.example.com;
    ssl_certificate /path/to/my/certs/example.com/fullchain.pem;
    ssl_certificate_key /path/to/my/certs/example.com/privkey.pem;

    # Redirect to the correct place, if needed
    set $https_redirect 0;
    if ($server_port = 80) { set $https_redirect 1; }
    if ($host ~ '^www\.') { set $https_redirect 1; }
    if ($https_redirect = 1) {
        return 301 https://example.com$request_uri;
    }

    location / {
    # ...
}

О, но если - зло !

Да, может быть. Но он существует не зря и не должен навредить тем, кто знать, как правильно им пользоваться. ;)

7
ответ дан 28 November 2019 в 19:33

Вот полный пример, который закончился тем, что работал на меня. Проблема была в том, что у меня не было ssl деталей (ssl_сертификат и т.д.) в блоке перенаправления www. Не забудьте проверить ваши логи (sudo tail -f /var/log/nginx/error.log)!

# HTTP — redirect all traffic to HTTPS
server {
    listen 80;
    listen [::]:80 default_server ipv6only=on;
    return 301 https://$host$request_uri;
}

# HTTPS — redirects www to non-www
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name www.example.com;

    # Use the Let's Encrypt certificates
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    # Include the SSL configuration from cipherli.st
    include snippets/ssl-params.conf;
    return 301 https://example.com$request_uri;
}

# HTTPS — proxy all requests to the app (port 3001)
server {
    # Enable HTTP/2
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name example.com sub.example.com;

    # Use the Let's Encrypt certificates
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    # Include the SSL configuration from cipherli.st
    include snippets/ssl-params.conf;

    # For LetsEncrypt:
    location ~ /.well-known {
        root /var/www/html;
        allow all;
    }

    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-NginX-Proxy true;
        proxy_pass http://localhost:3001;
        proxy_ssl_session_reuse off;
        proxy_set_header Host $http_host;
        proxy_cache_bypass $http_upgrade;
        proxy_redirect off;
    }
}
0
ответ дан 28 November 2019 в 19:33
server {
        listen 80;
        listen 443 ssl;
        server_name devly.co www.devly.co;

        ssl on;
        ssl_certificate /var/www/devly.co/cert/ssl-bundle.crt;
        ssl_certificate_key /var/www/devly.co/cert/devly_co.key;



        access_log   /var/log/nginx/devly.co.access.log rt_cache;
        error_log    /var/log/nginx/devly.co.error.log;
        root /var/www/devly.co/htdocs;
        index index.php index.htm index.html;

# force https-redirects
    if ($scheme = http) {
        return 301 https://$server_name$request_uri;
}


}
0
ответ дан 4 May 2021 в 21:13

Это у меня работает

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

server {
    listen 80;
    listen 443 ssl;
    server_name example.com;

    #location

}

p.s. с другими решениями, которые я получил: ERR_TOO_MANY_REDIRECTS

0
ответ дан 2 November 2021 в 11:48

Если у вас много доменови вы ищете более общий подходбез потери производительности и без перечисления всех доменов все время, проверьте это.

Как это работает?

  1. Прослушайте 80 и перенаправьте все http на https - включая http://www. , который перейдет к https://www.
  2. прослушайте 433, но только на wwwимена серверов и перенаправьте на не-wwwс помощью регулярного выражения
  3. прослушайте 433 для каждого из ваших не-wwwимя сервера - вот где весь трафик закончится

Это быстро?
Да! Несмотря на то, что мы используем RegExp, он находится только в блоке www-versions, который возвращает 301. Таким образом, весь обычный трафик будет обрабатываться без каких-либо дополнительных затрат на обработку.

  # Redirect everything to HTTPS (including "www")
  server {
    listen 80 default_server;
    listen [::]:80 default_server;
    return 301 https://$host$request_uri;
  }
  
  # Redirect away from "www" versions:
  server {
    listen [::]:443 ssl http2;
    listen 443 ssl http2;
    server_name www.example-1.com
                www.example-2.com
                www.example-3.com;
    # using generic "www" removal      // https://stackoverflow.com/questions/11323735/nginx-remove-www-and-respond-to-both/45676731#45676731
    if ( $host ~ ^www\.(.+)$ ) {
      set $without_www $1;
      rewrite ^ $scheme://$without_www$uri permanent;
    }
    # SSL settings:
    ssl_certificate /etc/letsencrypt/live/example/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/example/privkey.pem; # managed by Certbot
  }
  
  # And finally one "server" block for each of your domains
  server {
    listen [::]:443 ssl http2;
    listen 443 ssl http2;
    server_name example-1.com;
    # SSL settings, etc...
  }
  server {
    server_name example-2.com;
    # ... listen, ssl, etc...
  }
  server {
    server_name example-3.com;
    # ... etc
  }

PS:Если вам нужна помощь в настройке SSL, проверьте Mozilla SSL Configuration Generator:
https://ssl-config.mozilla.org/

0
ответ дан 18 January 2022 в 07:47

Теги

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