Prefacio
En primer lugar: una simple reescritura del puerto 80 -> puerto 443 NO solucionará esto. En casi todas las preguntas anteriores, hilo de correo, hilo de foro, etc., he encontrado que esta fue la primera respuesta ignorante y fue repitió varias veces.
En segundo lugar: sí, sé que no puede servir tráfico HTTP y HTTPS en el mismo puerto. Esto no es eso.
Guión:
Servidor Apache que aloja múltiples sitios a través de la multiplicación de puertos. El puerto 80 sirve un sitio público. El puerto 443 sirve la versión segura de ese sitio.
Los puertos 7443, 8443 y 9443 sirven cada uno a sitios separados con seguridad SSL.
Si un usuario escribe mal la URL, o se le da un enlace que no es válido, por ejemplo http: //hostname.tld: 7443 , se le da la siguiente página ridícula:
En lugar del servidor, simplemente los redirige a https: //hostname.tld: 7443 .
Mi pregunta es, ¿cómo, en nombre del ano de Zeus, puede modificar el comportamiento de Apache o este mensaje de error para redirigir al usuario automáticamente?
Apache obviamente está atendiendo una solicitud que no es https (para mostrar ese mensaje de error) a pesar de que está configurado para HTTPS. Me parece notablemente tonto no solo hacer la redirección de forma predeterminada, sino que puedo entender por qué siguieron el comportamiento que hicieron, incluso si no estoy de acuerdo. Entonces mi pregunta es: ¿puedes cambiarlo? Están manejando el error EN ALGÚN LUGAR, y con Apache siendo la cornucopia de configuración que es, es lógico que haya alguna directiva en algún lugar para manejar este comportamiento, pero hasta ahora no he podido encontrarlo en varias horas de ajustes.
Actualizar:
He intentado una variedad de cosas que incluyen:
usando
ErrorDocument 400
directivas para llegar a un script CGI y PHP que solo envíaStatus 301
yLocation
encabezados. Esto da como resultado una página en blanco. El usoErrorDocument 400 https://hostname.tld:7443
simple da como resultado que ese enlace se muestre en la página.El uso de casi todas las combinaciones de
mod_rewrite
I o Google puede generar, incluidas las declaraciones generales que dirigen el sitio por completo; Estos nunca funcionan. Literalmente, no hacen nada. Supongo que Apache está pateando el error anterior incluso antes de intentar procesar las directivas de reescritura.
No puedo usar redirecciones basadas en puertos, debido al uso de puertos personalizados. No puedo usar redireccionamientos basados en scripts porque nunca se reciben debido a la falta de coincidencia http / https. Estoy casi dispuesto a atribuir esto a un error o un comportamiento no intencionado, pero alguien tuvo la idea de poner un mensaje de error muy personalizado, no se molestaron en pensar que tal vez querrías simplemente llevarlo al URL que ya están proporcionando ?
fuente
Respuestas:
Creo que esto es probablemente un error en cómo Apache 2.2 y versiones anteriores manejan esta circunstancia particular.
Parece que en un
400 Bad Request
error de lectura SSL , Apache 2.2 no devuelve el código de respuesta HTTP o los encabezados, solo el cuerpo de respuesta HTTP. Pruebo haciendo telnet al puerto 443 y enviando:El servidor devuelve inmediatamente (para mí):
Tenga en cuenta la falta de un código de respuesta HTTP o cualquier encabezado HTTP.
Cuando hago esto en un servidor Apache 2.4, obtengo:
Si configuro una línea ErrorDocument como lo hiciste:
Luego obtengo el HTML para una redirección 302, pero de nuevo, ninguno de los encabezados. Sin el código de respuesta de redireccionamiento 302 y el
Location:
encabezado, el navegador no redirigirá.Intente actualizar a Apache 2.4 y vea si funciona. He probado y confirmado con al menos Apache 2.4.3, pero no me he esforzado por encontrar exactamente cuándo se actualizó este comportamiento. Sospecho que en la gran cantidad de trabajo que hicieron preparando 2.4, corrigieron el comportamiento indeseable como un efecto secundario.
Errores httpd relevantes de Apache:
ACTUALIZAR
Puede forzar un Apache con errores para que le dé el comportamiento que desea (la redirección) haciendo que el script imprima sus encabezados (que no se enviarán al cliente) y luego imprima manualmente los encabezados que desea. Aquí hay un script básico de Perl que funciona bajo Apache 2.2.22:
Debe tener en cuenta que hay otras razones por las que se puede generar un 400 además de hablar con un puerto SSL sin SSL. La manera fácil de determinar esto es buscar la
HTTPS
variable de entorno. Si está configurado, entonces SSL se negoció correctamente y algo más está causando el 400 (no haga el truco de doble encabezado si ese es el caso). SiHTTPS
no está configurado, devuelva su redirección como se indicó anteriormente.fuente
<javascript
etiqueta y tener la suerte de piratear la redirección de esa manera, pero hasta ahora, no dado. Nada de esto parece ser manejados de una manera que sigue lo impresionante de Apache por lo demás bastante rígida ...Puedes arreglar esto con mod-rewrite. Establecer una regla para que coincida con cualquier cosa. Ver esta respuesta en Stackoverflow
fuente
sites-available
directorio. Incluso si solo lo redirige a tonterías, o lo redirige a un sitio diferente, a un puerto diferente, etc., sigue cargando esa 400 Solicitud incorrecta.