Puedo usar proxy inverso con Nginx y quiero a la fuerza de la solicitud en HTTPS, por lo que si un usuario quiere acceder a la url con http, será redirigido automáticamente a HTTPS.

También estoy usando un puerto no estándar.

Aquí está mi nginx proxy inverso de configuración:

server {
    listen 8001  ssl;
    ssl_certificate /home/xxx/server.crt;
    ssl_certificate_key /home/xxx/server.key;
    location /{
        proxy_pass https://localhost:8000;
        proxy_redirect off;
        proxy_set_header Host $host:$server_port;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Ssl on;
        proxy_set_header  X-Forwarded-Proto  https;
    }
}

He intentado muchas cosas y también leer las publicaciones acerca de él, incluyendo este serverfault pregunta, pero nada ha funcionado hasta ahora.

  • La reapertura de los revisores: Esta pregunta es sin duda relacionados con la programación, y muy específicos. Sólo que el ‘puerto no estándar» no se mencionó antes, lo que podría haber hecho un poco vago antes.
  • Es francamente mal que esta estaba cerrada, como fuera de tema. nginx es una herramienta común utilizada en la programación, y la más alta calificación de la solución presente el código correcto para solucionar el problema: error_page 497 https://$host:$server_port$request_uri;
InformationsquelleAutor rbinsztock | 2013-03-15

4 Comentarios

  1. 68

    Encontrado algo que está funcionando bien :

    server {
            listen 8001  ssl;
            ssl_certificate /home/xxx/server.crt;
            ssl_certificate_key /home/xxx/server.key;
            error_page 497  https://$host:$server_port$request_uri;
            location /{
                proxy_pass http://localhost:8000;
                proxy_redirect off;
                proxy_set_header Host $host:$server_port;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Ssl on;
            }
    }
    
    • código de error 497 creada especialmente para este caso de uso [redirigir en el mismo puerto de http a https]. Creo que esta es la mejor respuesta. wiki.nginx.org/HttpSslModule#Nonstandard_error_codes
    • Muchas gracias!!! error_page 497 https://$host:$server_port$request_uri; hizo el truco!
    • Me gustaría considerar la adición de: error_page 497 301 =307 https://$host:$server_port$request_uri; de Esa manera el método de solicitud no es auto convertidos a un GET como es el predeterminado
  2. 4

    Son usted seguro de que su solución está trabajando? Es escuchar 8001 ssl. Se acepta la solicitud http?

    Yo lo hago de esta manera:

    server {
        listen   80;
        server_name  yourhostname.com;
    
        location /{
                rewrite ^(.*) https://yourhostname.com:8001$1 permanent;
        }
    }
    

    Luego se va a su config:

    server {
        listen 8001  ssl;
        ssl_certificate /home/xxx/server.crt;
        ssl_certificate_key /home/xxx/server.key;
        location /{
            proxy_pass https://localhost:8000;
            proxy_redirect off;
            proxy_set_header Host $host:$server_port;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Ssl on;
            proxy_set_header  X-Forwarded-Proto  https;
        }
    }
    
    • sí, mi solución es el trabajo, el puerto 80 es ya utilizado por otro servidor nginx con subdominio passenger_base uri.
    • FWIW, OP solución no funciona para mí. El tuyo lo hizo.
  3. 1

    Puede

    1. uso $server_name para evitar la codificación duro de su nombre de dominio nuevo (SECO),
    2. uso retorno 301 por un poco más fácil de leer (un desarrollador web debe saber este código de estado http)

    Nota: puse 443 para https del servidor. Usted puede escuchar 8001, si usted realmente quiere que.

    server {
        listen   80;
        server_name  your_hostname.com;
    
        return 301 https://$server_name$request_uri;
    }
    ...
    server {
        listen 443 ssl;
        server_name your_hostname.com
        ...
    }
    
    • bueno, yo lo uso de proxy inverso con nginx porque tengo diferentes RoR entorno para cada una de las aplicaciones. Así que me pongo mi app con un servidor independiente del Pasajero + nginx y el uso de un proxy inverso para agregar los Certificados SSL. Porque no puedo agregar SSL Cert ruta con la versión independiente.
    • Si me cambio de error_page 497 https://$host:$server_port$request_uri; por el retorno 301 https://$host:$server_port$request_uri; tengo esta y la redirección se rompió de nuevo. 400 Solicitud incorrecta de La llanura de la solicitud HTTP fue enviado a puerto HTTPS
    • Lo que yo veo. Su respuesta debe ser la mejor respuesta. la pregunta es que va a través de un puerto no estándar, y que desea redirigir el tráfico de http a https en el MISMO puerto. Por lo que es imposible para configurar el servidor de 2 bloques como yo pensaba originalmente, debido a que usted no puede tener el servidor de 2 bloques escuchando en el mismo puerto.
    • por qué no responder a su propia pregunta? y voy a upvote la suya. Así que es más fácil a otras personas a aprender de esto. Por favor actualizar la pregunta en sí misma y el estado de la cuestión principal: redireccionar en el mismo puerto de http a https
    • yo no puedo aceptar mi propia respuesta en 2 días 🙂 pero se hace gracias. Tal vez alguien puede proponer otra solución. Muchas gracias por tu ayuda!
  4. 1

    Esto funcionó para mí:

    server {
    listen       80;
    server_name  localhost;
    ...
    if ($http_x_forwarded_proto = "http") {
          return 301 https://$server_name$request_uri;
    }
    location /{
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://localhost:8080;
    }
    
    ...
    }
    

Dejar respuesta

Please enter your comment!
Please enter your name here