2016-07-12 9 views
0

Ich habe 2 Domains auf meinem Server laufen, NGINX nur proxies sie zu Knoten-Apps. Ich habe ein Zertifikat für eins, aber für das andere benutze ich nur cloudflare, um HTTPS bereitzustellen. Ich möchte sicherstellen, dass Benutzer, die eine der Domains besuchen, immer auf die HTTPS-Version der Domain weitergeleitet werden, ohne ein www. Dies ist meine aktuelle Konfiguration, den Block für die domain2 Konfigurationsdatei scheint uncommenting beiden Seiten zu brechen :(NGINX 2 Domains auf der gleichen IP, wollen beide auf HTTPS umleiten

domain1 Konfigurationsdatei:

upstream domain1.com { 
    server 127.0.0.1:8000; 
    keepalive 8; 
} 

server { 

    listen 0.0.0.0:80; 
    server_name domain1.com www.domain1.com; 
    return 301 https://domain1.com$request_uri; 

} 

server { 
    #listen 80; 
    listen 443 ssl http2; 
    server_name domain1.com; 
    access_log /var/log/nginx/domain1.com.log; 

    root /var/www/domain1.com/client/public; 

    include /etc/nginx/global/cloudflare-allow.conf; 

    ssl_certificate /etc/nginx/ssl/domain1.crt; 
    ssl_certificate_key /etc/nginx/ssl/domain1.key; 

    if ($bad_referer) { 
     return 444; 
    } 

    location/{ 
     proxy_http_version 1.1; 
     proxy_set_header X-Real-IP $remote_addr; 
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
     proxy_set_header Host $http_host; 
     proxy_set_header X-NginX-Proxy true; 
     proxy_set_header Connection ""; 

     proxy_pass http://domain1.com; 
     proxy_redirect off; 
    } 

    location ~* \.(?:jpg|jpeg|gif|png|ico|cur|gz|svg|svgz|mp4|ogg|ogv|webm|htc|webp)$ { 
     expires 1M; 
     access_log off; 
     add_header Cache-Control "public"; 
    } 

    # CSS and Javascript 
    location ~* \.(?:css|js)$ { 
     expires 1y; 
     access_log off; 
     add_header Cache-Control "public"; 
    } 

    location ~* \.(?:rss|atom)$ { 
     expires 1h; 
     add_header Cache-Control "public"; 
    } 

    location ~* \.(?:manifest|appcache|html?|xml|json)$ { 
     expires -1; 
    } 

} 

server { 

    listen 443 ssl http2; 
    server_name www.domain1.com; 
    return 301 https://domain1.com$request_uri; 

} 

domain2 Konfigurationsdatei:

upstream domain2.com { 
    server 127.0.0.1:9000; 
    keepalive 8; 
} 

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

server { 
    listen 80; 
    #listen 443 ssl http2; 
    server_name domain2.com; 
    access_log /var/log/nginx/domain2.com.log; 

    root /var/www/domain2.com; 

    include /etc/nginx/global/cloudflare-allow.conf; 

    if ($bad_referer) { 
     return 444; 
    } 

    location/{ 
     proxy_http_version 1.1; 
     proxy_set_header X-Real-IP $remote_addr; 
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
     proxy_set_header Host $http_host; 
     proxy_set_header X-NginX-Proxy true; 
     proxy_set_header Connection ""; 

     proxy_pass http://domain2.com; 
     proxy_redirect off; 
    } 

    location ~* \.(?:jpg|jpeg|gif|png|ico|cur|gz|svg|svgz|mp4|ogg|ogv|webm|htc|webp)$ { 
     expires 1M; 
     access_log off; 
     add_header Cache-Control "public"; 
    } 

    # CSS and Javascript 
    location ~* \.(?:css|js)$ { 
     expires 1y; 
     access_log off; 
     add_header Cache-Control "public"; 
    } 

    location ~* \.(?:rss|atom)$ { 
     expires 1h; 
     add_header Cache-Control "public"; 
    } 

    location ~* \.(?:manifest|appcache|html?|xml|json)$ { 
     expires -1; 
    } 

} 

Antwort

1

Wenn SSL über den flexiblen SSL-Modus von CloudFlare ausgeführt wird, erfolgt die Kommunikation zum Ursprung über HTTP-Verkehr über Port 80.

Um zu erkennen, ob dieser Datenverkehr HTTPS ist, können Sie die HTTPS-Umgebungsvariable nicht verwenden. Sie müssen dann überprüfen, ob der Header X-Forwarded-Proto auf HTTPS gesetzt ist.

Sie können dies in Nginx wie folgt vorgehen:

if ($http_x_forwarded_proto != "https") { 
    rewrite ^(.*)$ https://$server_name$1 permanent; 
} 

Je einfacher Weg, dies zu tun, ist eine "Always use HTTPS" Page Rule in CloudFlare einfach eingestellt.