2011-12-08 14 views
10

Aktualnie używam mojej witryny na http i chcę przenieść ją do https, tak aby nginx automatycznie obsługiwał przekierowanie. Myślę, że jest to dość trywialne.Przekierowuj cały adres http do https w nginxie, z wyjątkiem jednego pliku

Istnieje jednak jeden plik, który (z kilku powodów) jest łączony na gorąco z innych witryn, z których niektóre są nad http i niektóre z ponad https. Chcę się upewnić, że plik jest dostępny zarówno w protokole http, jak i https, aby zapewnić, że przeglądarki nie narzekają na okno dialogowe "mieszana zawartość". Ścieżka pliku wygląda mniej więcej tak:

http (s): //mydomain.com/scripts/ [some_sha1_hash] /file.js

Więc reguła nginx powinien powiedzieć: „Jeżeli wniosek jest już ponad https, wszystko jest słodkie, i po prostu odwróć proxy, w przeciwnym razie przekieruj wszystkie żądania z http na https, z wyjątkiem sytuacji, gdy żądany jest ten plik, w takim przypadku nie wykonuj żadnego przekierowania http-> https. "

Czy ktoś może mi powiedzieć, gdzie szukać, aby dowiedzieć się o takiej konfiguracji, lub pomóc mi w konfiguracji? Z góry dziękuję. (Przepraszam, ale nie jestem jeszcze wystarczająco wykwalifikowanych w konfiguracji nginx.)

Odpowiedz

-2
server { 
    listen   80; 
    server_name my.domain.com; 
    rewrite  ^https://$server_name$request_uri? permanent; 
} 

server { 
    listen   443; 
    server_name my.domain.com; 

    ssl   on; 

    [....] 
} 

Powyższe powinno głównie rade, jeśli im nie źle

+3

To nie wygląda na to, że wykluczy jeden plik, który chcę wyłączyć. Czy jestem w błędzie? –

+0

+1 dla rozwiązania, które nie zawiera logiki w bloku 'location'. – orokusaki

3

Spróbuj tego:

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

    # <ssl settings> 
    # ... other settings 

    location = /scripts/[some_sha1_hash]/file.js { 
    # Empty block catches the match but does nothing with it 
    } 

    location/{ 
    if ($scheme = "http") { 
     rewrite^https://$http_host$request_uri? permanent; 
    } 

    # ... other settings 
    } 
} 
5

to, co zrobiłem, który działa:

server { 
    listen 80; 
    server_name example.com; 
    charset  utf-8; 
    access_log /var/www/path/logs/nginx_access.log; 
    error_log /var/www/path/logs/nginx_error.log; 

    location /path/to/script.js { 
      # serve the file here 
    } 
    location/{ 
     return 301 https://example.com$request_uri; 
    } 
} 

to jeden obsługuje tylko żądania hTTP i służy wspomniany plik - inaczej czerwony zmienia się na https. Zdefiniuj blok serwera ssl, który będzie obsługiwał wszystkie żądania https.

server { 
    listen   443; 
    server_name example.com; 

    ssl   on; 

    # rest of the config 
} 

W ten sposób twój plik skryptu będzie dostępny zarówno dla http, jak i https.

Powiązane problemy