2014-10-06 20 views
21

Zajmuję witrynę za serwerem proxy Cloudflare, co oznacza, że ​​wszystkie żądania na mój serwer są realizowane przez port 80, mimo że Cloudflare obsługuje ruch HTTP (port 80) i HTTPS (port 443).Jak wykonać przekierowanie nginx na podstawie wartości nagłówka?

Aby rozróżnić te dwa, Cloudflare zawiera nagłówek X-Forwarded-Proto, który jest ustawiony na "http" lub "https" na podstawie połączenia użytkownika.

Chciałbym przekierować każde żądanie z nagłówkiem X-Forwarded-Proto: http do wersji SSL mojej witryny. Jak mogę to osiągnąć dzięki konfiguracji nginx?

+0

Tylko szybki zwróć uwagę, że CloudFlare nie obsługuje zawartości Twojej witryny. Uwaga: PageRules również mógł tu działać, ponieważ wygląda na to, że próbujesz przekazać http: // do https: //. Informacje o PageRules: https://support.cloudflare.com/hc/en-us/articles/200168306-Is-there-a-tutorial-for-Page-Rules- – damoncloudflare

Odpowiedz

30

Najprostszy sposób to zrobić z dyrektywą if. Jeśli jest lepszy sposób, daj mi znać, ponieważ ludzie mówią, że dyrektywa if jest nieskuteczna. Nginx konwertuje myślniki do podkreśleń w nagłówkach, więc X-Forwarded-Proto staje się .

server { 
    listen 80; 
    server_name example.com; # Replace this with your own hostname 
    if ($http_x_forwarded_proto = "http") { 
     return 301 https://example.com$request_uri; 
    } 

    # Rest of configuration goes here... 
} 
+2

Nie wiesz, z kim rozmawiasz, ale jeśli jest, nieefektywne. Jest podatny na błędy, gdy jest wykorzystywany do celów spoza dziedziny przepisywania. Przeczytaj artykuł "Jeśli jest zły", aby zrozumieć jego wady. Twoje rozwiązanie jest tym, do czego zostało zaprojektowane, więc powinno działać dobrze. – Melvyn

+8

Tylko mała uwaga: jeśli masz wiele wartości nazwa_serwera, lepiej zastąpić zwracany ciąg bardziej ogólną wersją: return 301 https: // $ host $ request_uri; – Alekc

0

Spróbuj użyć dyrektywy mapa: http://nginx.org/en/docs/http/ngx_http_map_module.html#map

Coś takiego ...

map $http_x_forwarded_proto  $php_backend { 
    "https"   "https_php_backend named loc"; 
    default  "default_php_backend named loc"; 
} 
server{ 
    location/{ 
     proxy_pass http://$php_backend; 
    } 
} 

Ten kod jest abstrakcyjny, ale można spróbować tht drogę ...

Powiązane problemy