web-dev-qa-db-fra.com

Forcer www. et https dans nginx.conf (SSL)

Après avoir acheté un certificat SSL, j'ai essayé de forcer toutes les pages à sécuriser https et à www.

https://www.exampl.com fonctionne et est sécurisé mais uniquement si vous le saisissez exactement. www.example.com ou example.com pointent toujours vers http.

Nous utilisons nginx comme proxy et devons y entrer la réécriture. J'ai un accès SSH/root via PuTTY. J'ai accédé à nginx.conf en entrant dans PuTTY.

Et maintenant? Dois-je saisir les commandes nginx sur cette page? Commencer où se trouve le curseur? Toutes les lignes de commande en premier?

HTTPS:

. htacess - Le code original m'a été donné avant de découvrir que je devais entrer dans nginx

RewriteEngine On 
RewriteCond %{HTTP_Host} ^example.com [NC]
RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ https://www.example.com/$1 [R,L]

Convertisseur de code Nginx - Voici comment cela s'affiche sur le convertisseur. Est-ce que tout est sur les bonnes lignes?

# nginx configuration location / {
if ($http_Host ~* "^example.com"){
rewrite ^(.*)$ http://example.com/$1 redirect; } }

puis

[~ # ~] www [~ # ~]

. htacess - Le code original m'a été donné avant de découvrir que je devais entrer dans nginx

#Force www:
RewriteEngine on
RewriteCond %{HTTP_Host} ^example.com [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [L,R=301,NC]

Convertisseur de code Nginx - Voici comment cela apparaît sur le convertisseur. Est-ce que tout est sur la bonne ligne?

# nginx configuration location / { 
if ($http_Host ~* "^example.com"){ 
rewrite ^(.*)$ http://www.example.com/$1 redirect; } 

}

Dois-je alors enregistrer? Redémarrer?

Toute aide serait grandement appréciée. Je lutte contre cela depuis des semaines. Ma société d'hébergement a aidé dans la mesure du possible, maintenant j'apprends à la volée…. Ou devrais-je simplement arrêter et embaucher un développeur? $$$

Merci

12
Ender17

La meilleure façon d'implémenter la redirection WWW et HTTPS est de créer une nouvelle section server dans la configuration Nginx:

server {
    listen      80;   #listen for all the HTTP requests
    server_name example.com www.example.com;
    return      301         https://www.example.com$request_uri;
}

Vous devrez également effectuer https://example.com à https://www.example.com redirection. Cela peut être fait avec un code similaire au suivant:

server {
    listen              443 ssl;
    server_name         example.com;

    ssl_certificate     ssl.crt; #you have to put here...
    ssl_certificate_key ssl.key; #   ...paths to your certificate files
    return      301     https://www.example.com$request_uri;
}

Et bien sûr, vous devez recharger la configuration Nginx après chaque modification. Voici quelques commandes utiles:

vérifier les erreurs de configuration:

Sudo service nginx configtest

recharger la configuration (cela suffirait pour que les changements "fonctionnent"):

Sudo service nginx reload

redémarrez l'ensemble du serveur Web:

Sudo service nginx restart

Remarque importante:

Toutes vos sections server doivent se trouver dans la section http (ou dans un fichier inclus dans la section http):

http {
    # some directives ...
    server {
        # ...
    }
    server {
        # ...
    }
    # ...
}
32
Oleg

La solution suivante semble être claire et simple, tout est défini dans un bloc serveur. Donc, avec cette configuration, je force tout à https: //www.domain.tld , donc les deux gestionnaires sont ici non-HTTPS et non-WWW sur HTTPS . Il y a deux IF mais si vous ne voulez pas dupliquer le bloc SSL entier deux fois pour le gérer ... c'est la façon de le faire.

server {
    listen 80;
    listen 443 ssl;

    server_name domain.tld www.domain.tld;

    # global HTTP handler
    if ($scheme = http) {
        return 301 https://www.domain.tld$request_uri;
    }

    # global non-WWW HTTPS handler
    if ($http_Host = domain.tld){
        return 303 https://www.domain.tld$request_uri;
    }
}

Et encore meilleure solution pour éviter les IF:

# Redirect all traffic from HTTP to HTTPS
server {
    listen 80;

    server_name example.com www.example.com;

    # Destination redirect base URI
    set $RURI https://www.example.com;

    location / {return 301 $RURI$request_uri;}
}

# Redirect non-WWW HTTPS traffic to WWW HTTPS
server {
    listen 443 ssl;
    # NOTE: SSL configuration is defined elsewhere
    server_name example.com;
    return 301 $scheme://www.$Host$request_uri;
}

# MAIN SERVER BLOCK
server {
    listen 443 ssl;
    # NOTE: SSL configuration is defined elsewhere
    server_name www.example.com;
}
10
stamster

Si vous disposez d'un répertoire activé pour les sites, n'utilisez pas la directive supérieure "http". Créez simplement un autre fichier (avec n'importe quel nom) dans le répertoire activé par le site qui a:

server {
    listen      80;   #listen for all the HTTP requests
    server_name example.com www.example.com;
    return      301         https://www.example.com$request_uri;
}

et commenter la ligne

listen 80; 

où le nom_serveur est le même dans l'autre fichier qui sert www.example.com

0
David Noriega