2017-09-16 2 views
0

Ich benutze Nginx für eine Website, die auch APIs verfügbar macht.Konfigurieren Sie Nginx Traffic auf http oder https basierend auf URL zu leiten

Ich möchte ein SSL-Zertifikat auf der Website hinzuzufügen und:

  • Direkt-Website-Traffic auf https (443)
  • aber halten alle die API-Anrufe gehen auf http (80)

die alle API-Verkehr ist insofern einzigartig, als es eine URL mit api nach dem Namen der Website aufruft:

    www.example.com/
  • api/...

ich das bin der Hoffnung, mit einer Kombination von Nginx Server/Standort Blöcke durchgeführt werden. So etwas wie folgt aus:

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

    # direct all api traffic (www.example.com/api/) via http 
    location /api/ { 
     root /full_path_to_api_code  # '/api/' location value will be appended 
    } 

    # redirect all non api traffic to https block 
    location/{ 
     return 301 https://$server_name$request_uri; 
    } 
} 

# https 
server { 
    listen    443 ssl; 
    server_name   example.com www.example.com; 

    ssl_certificate  www.example.com.crt; 
    ssl_certificate_key www.example.com.key; 

    ... 
} 

ich bin der Hoffnung, ‚Standort/api /‘ Block fängt die alle api Anrufe und einfach lässt sie durch unverändert passieren, wie sie waren. Vielleicht gibt es einen besseren Weg, dies zu tun?

Ich würde mich freuen, wenn mir jemand sagen kann, ob das möglich ist und ob dies der richtige Weg ist?

+0

Das ist für mich gut aussieht. –

Antwort

0

Ihre Konfiguration ist gut. Die einzige Sache, die Sie ändern können, ist, sie in denselben Block zu kombinieren, wenn Sie in Ordnung sind, jemand, der die API auf http oder https aufruft. Dann können Sie es tun, wie unten

# http 
server { 
    listen    80; 
    listen    443 ssl; 
    ssl_certificate  www.example.com.crt; 
    ssl_certificate_key www.example.com.key; 
    server_name   example.com www.example.com; 

    # direct all api traffic (www.example.com/api/) via http 
    location /api/ { 
     root /full_path_to_api_code 
    } 

    # redirect all non api traffic to https block 
    location/{ 
     if ($scheme ="http") { 
     # redirect all non api traffic to https block 
     return 301 https://$server_name$request_uri; 
     } 

     normal https request processing 
    } 
} 

ich noch mit der Config gehen würde, der Grund dafür ist, if is evil

+0

Danke für Ihren Vorschlag. Ich kann bestätigen, dass ich jetzt den obigen Ansatz mit zwei Serverblöcken implementiert habe und dass es wie vorgesehen funktioniert hat. Der Vollständigkeit halber können die Protokolldateien 'access_log' und' error_log' in jedem Serverblock (als gleich oder verschieden) oder extern in der Datei '/ etc/nginx/nginx.conf' definiert werden. – Ric

Verwandte Themen