free - Tratando con nginx 400 "El error de solicitud HTTP simple fue enviado al puerto HTTPS"




windows vs (8)

Aquí hay un ejemplo para configurar HTTP y HTTPS en el mismo bloque de configuración con soporte ipv6 . La configuración se prueba en Ubuntu Server y NGINX / 1.4.6 pero esto debería funcionar con todos los servidores.

server {
    # support http and ipv6
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;

    # support https and ipv6
    listen 443 default_server ssl;
    listen [::]:443 ipv6only=on default_server ssl;

    # path to web directory
    root /path/to/example.com;
    index index.html index.htm;

    # domain or subdomain
    server_name example.com www.example.com;

    # ssl certificate
    ssl_certificate /path/to/certs/example_com-bundle.crt;
    ssl_certificate_key /path/to/certs/example_com.key;

    ssl_session_timeout 5m;

    ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers "HIGH:!aNULL:!MD5 or HIGH:!aNULL:!MD5:!3DES";
    ssl_prefer_server_ciphers on;
}

No incluya ssl on que pueda causar 400 error. La configuración anterior debería funcionar para

http://example.com

http://www.example.com

https://example.com

https://www.example.com

¡Espero que esto ayude!

Estoy ejecutando una aplicación Sinatra detrás de passenger / nginx. Estoy intentando que responda tanto a llamadas http como a https. El problema es que cuando ambos se definen en el bloque del servidor, las llamadas a https se responden normalmente, pero el resultado es un error de 400 "Se envió la solicitud HTTP simple al puerto HTTPS". Esto es para una página estática así que supongo que Sinatra no tiene nada que ver con esto. ¿Alguna idea sobre cómo solucionar este problema?

Aquí está el bloque de servidores:

server {
        listen 80;
        listen 443  ssl;
        server_name localhost;
        root /home/myhome/app/public;
        passenger_enabled on;

        ssl on;
        ssl_certificate      /opt/nginx/ssl_keys/ssl.crt;
        ssl_certificate_key  /opt/nginx/ssl_keys/ssl.key;
        ssl_protocols        SSLv3 TLSv1;
        ssl_ciphers          HIGH:!aNULL:!MD5;

        location /static {
            root  /home/myhome/app/public;
            index  index.html index.htm index.php;
        }

        error_page 404 /404.html;

        # redirect server error pages to the static page /50x.html
        error_page 500 /500.html;

        access_log /home/myhome/app/logs/access.log;
        error_log /home/myhome/app/logs/error.log;
}

Las respuestas anteriores son incorrectas, ya que sobrepasan con creces la prueba de "es esta conexión HTTPS" para permitir el acceso a las páginas en http, independientemente de la seguridad de la conexión.

La respuesta segura utilizando una página de error en un código de error http 4xx específico de NGINX para redirigir al cliente y volver a intentar la misma solicitud a https. (como se describe aquí https://serverfault.com/questions/338700/redirect-http-mydomain-com12345-to-https-mydomain-com12345-in-nginx )

El OP debería usar:

server {
  listen        12345;
  server_name   php.myadmin.com;

  root         /var/www/php;

  ssl           on;

  # If they come here using HTTP, bounce them to the correct scheme
  error_page 497 https://$host:$server_port$request_uri;

  [....]
}

De acuerdo con el artículo de Wikipedia sobre códigos de estado . Nginx tiene un código de error personalizado cuando el tráfico http se envía al puerto https (código de error 497)

Y de acuerdo con los documentos de nginx en la página de error , puede definir un URI que se mostrará para un error específico.
Por lo tanto, podemos crear un uri al que se enviará a los clientes cuando se genere el código de error 497.

nginx.conf

#lets assume your IP address is 89.89.89.89 and also 
#that you want nginx to listen on port 7000 and your app is running on port 3000

server {
    listen 7000 ssl;

    ssl_certificate /path/to/ssl_certificate.cer;
    ssl_certificate_key /path/to/ssl_certificate_key.key;
    ssl_client_certificate /path/to/ssl_client_certificate.cer;

    error_page 497 301 =307 https://89.89.89.89:7000$request_uri;

    location / {
        proxy_pass http://89.89.89.89:3000/;

        proxy_pass_header Server;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Protocol $scheme;
    }
}

Sin embargo, si un cliente realiza una solicitud a través de cualquier otro método, excepto un GET, esa solicitud se convertirá en un GET. Por lo tanto, para preservar el método de solicitud al que ingresó el cliente; utilizamos redireccionamientos de procesamiento de errores como se muestra en documentos nginx en error_page

Y es por eso que usamos la redirección 301 =307 .

Usando el archivo nginx.conf que se muestra aquí, podemos hacer que http y https escuchen en el mismo puerto


El error lo dice todo en realidad. Su configuración le dice a Nginx que escuche en el puerto 80 (HTTP) y use SSL. Cuando dirige su navegador a http://localhost , intenta conectarse a través de HTTP. Como Nginx espera SSL, se queja con el error.

La solución es muy simple. Necesitas dos secciones de server :

server {
  listen 80;

  // other directives...
}

server {
  listen 443;

  ssl on;
  // SSL directives...

  // other directives...
}

Tuve exactamente el mismo problema, tengo la misma configuración que su ejemplo y lo conseguí trabajando eliminando la línea:

ssl on;

Para citar el documento:

Si los servidores HTTP y HTTPS son iguales, un solo servidor que maneje solicitudes HTTP y HTTPS se puede configurar eliminando la directiva "ssl on" y agregando el parámetro ssl para el puerto *: 443


En realidad, puedes hacer esto con:

ssl off; 

Esto resolvió mi problema al usar nginxvhosts; ahora puedo usar tanto SSL como HTTP simple. Funciona incluso con puertos combinados.


if use phpmyadmin add: fastcgi_param HTTPS activado;


Terminé yendo con esta solución:

server {

    listen 80;
    server_name example.com;
    root /var/www/example.com;

    # Any route containing a file extension (e.g. /devicesfile.js)
    location ~ ^.+\..+$ {
        try_files $uri =404;
    }

    # Any route that doesn't have a file extension (e.g. /devices)
    location / {
        try_files $uri /index.html;
    }

}

De esta forma, al menos recibo los errores 404 adecuados si no se encuentra un archivo.





nginx