2017-02-20 20 views
1

Я настроил Nginx таким образом:Как пересылать конкретные запросы HTTPS в Nginx

#/etc/nginx/conf.d/default.conf 
server { 
     listen 8081 default_server; 
     listen [::]:8081 default_server ipv6only=on; 

     server_name localhost; 

     listen 443 ssl; 

     location /site/ { 
      proxy_pass http://127.0.0.1:8084/; 
     } 

     # 404 occured 
     #location /site/secure/ { 
     # proxy_redirect http://localhost:8081/site/secure/ https://localhost/site/secure/; 
     #} 


     location/{ 
      root /srv; 
      index index.html index.htm; 

      try_files $uri $uri/ /index.html; 
     } 

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

} 

Я включил протокол HTTPS. У меня есть несколько URLs:

http://127.0.0.1:8081/site/secure/ 
http://127.0.0.1:8081/sute/path1/... 
http://127.0.0.1:8081/sute/path2/... 

Я хочу, чтобы перенаправить только http://127.0.0.1:8081/site/secure/* запросы https://127.0.0.1/site/secure/*, так что пользователь не может использовать этот адрес с простым HTTP.

Но когда я бег Nginx с этим перенаправлением:

location /site/secure/ { 
    proxy_redirect http://localhost:8081/site/secure/ https://localhost/site/secure/; 
} 

Я получаю ответ 404:

<html> 
    <head> 
     <title>404 Not Found</title> 
    </head> 
    <body bgcolor="white"> 
     <center> 
      <h1>404 Not Found</h1> 
     </center> 
     <hr> 
     <center>nginx/1.4.6 (Ubuntu)</center> 
    </body> 
</html> 

Как я могу настроить Nginx перенаправить некоторый запрос на HTTPS в правильном направлении?

ответ

1

proxy_redirect - неправильная директива. Вам нужно использовать что-то вроде return 301 https://..., чтобы переместить клиента с http на https.

Самый чистый подход состоит в том, чтобы использовать два блока server и вывести общие инструкции конфигурации с помощью директивы include. Например:

server { 
    listen 8081 default_server; 
    listen [::]:8081 default_server ipv6only=on; 

    include /path/to/common/bits; 

    location ^~ /site/secure/ { 
     return 301 https://$host$request_uri; 
    } 
} 

server { 
    listen 443 ssl; 
    ssl_certificate /etc/nginx/ssl/nginx.crt; 
    ssl_certificate_key /etc/nginx/ssl/nginx.key; 

    include /path/to/common/bits; 
} 
+0

Благодарим за отзыв. Но у меня есть [читать] (http://stackoverflow.com/documentation/nginx/3631/useful-redirects/12493/https-redirect#t=201702201618433467434), что лучше вернуть код состояния 307, поскольку он сохраняет тип запроса. –

+0

Действительное рассмотрение. Но это также зависит от приложения. Возможно, вам понадобится POST для http, чтобы с ошибкой избежать маскировки серьезной ошибки. –

+0

У меня проблема при реализации текущего решения. Когда я отправляю запрос на '/ site/secure /' через http, у меня есть заголовок запроса 'Content-Type: application/json; charset = UTF-8'. Но когда он перенаправлен на запрос https, у него нет 'Content-Type', поэтому я получаю сообщение об ошибке с сервера. Вы знаете, как сохранить «Content-Type» во время перенаправления на https? Спасибо за ответ. –